Моя проблема: Мне нужно скопировать определенные значки на рабочие столы пользователей, которые указывают на различные ресурсы 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.