передача системной переменной внутрь другой переменной

передача системной переменной внутрь другой переменной

Моя проблема: Мне нужно скопировать определенные значки на рабочие столы пользователей, которые указывают на различные ресурсы engrg. Эти значки обновляются довольно регулярно. Мой первоначальный пакетный файл просто использовал robocopyэто, и работал отлично.

robocopy "[NetworkDrive]\folderX\Desktop" "%userprofile%\Desktop"

По крайней мере, так было у большинства людей. По мере развертывания Office365 и OneDrive, люди синхронизируют свои рабочие столы. В этом случае %userprofile%\desktop — это не местоположение рабочего стола. Это нечто совсем иное:

c:\users\username\one_drive_enterprise_name\Desktop

Поэтому я отрегулировал свою партию следующим образом:

set KEY_NAME="HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"

set VALUE_NAME="Desktop"

FOR /F "skip=2 tokens=2,*" %%A IN ('reg.exe query %KEY_NAME% /v %VALUE_NAME%') DO SET LUD=%%B

echo "%LUD%"

robocopy "[NetworkDrive]\folderX\Desktop" "%LUD%"

%LUD%возвращает соответствующий ключ для данного пользователя.

Я получаю либо %userprofile%\desktopИЛИ"c:\users\username\one_drive_enterprise_name\Desktop."

Но когда я передаю его %LUD%внутрь robocopy, он воспринимает его как буквальный путь и добавляет к нему префикс с текущим местоположением пакетного файла.

c:\users\current user\desktop\userprofile\desktop в качестве примера.

В итоге у меня на рабочем столе появилась новая папка %userprofile% с подпапкой Desktop. :)

Как передать соответствующее значение, используя другой If>Then с простыми жестко закодированными путями?

Спасибо, Кевин.

решение1

Проблема в том, что значение переменной LUDсодержит %символы, ссылающиеся на другую переменную.

Возможно, есть более эффективный способ, но можно сделать что-то вроде этого:

echo set folder=%LUD% > "%TEMP%\setfolder.bat"
call "%TEMP%\setfolder.bat"
del "%TEMP%\setfolder.bat"
echo %folder%

решение2

Что-то вроде этого должно исправить это, оно получает содержимое переменных внутри %LUD%, а не саму переменную:

для /f "delims=" %%a in ('echo %LUD%') do set LUD=%%a

@echo off
set KEY_NAME="HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders"

set VALUE_NAME="Desktop"

FOR /F "skip=2 tokens=2,*" %%A IN ('reg.exe query %KEY_NAME% /v %VALUE_NAME%') DO SET LUD=%%B

for /f "delims=" %%a in ('echo %LUD%') do set LUD=%%a

robocopy "[NetworkDrive]\folderX\Desktop" "%LUD%"

решение3

Поговорив с некоторыми коллегами, я нашёл ещё два варианта...

1 — просто используйте общедоступный рабочий стол для всех и на этом закончите. C:\users\public\desktop

2 - используйте ключ "Shell Folder" вместо "User Shell Folder". Почему? Потому что ключ "shell folder" содержит только фактические пути, без переменных. IOW, удалите "user" из KEY_NAME.

Связанный контент