我的問題:我需要將特定圖示複製到指向各種 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% 內變數的內容而不是變數本身:
for /f "delims=" %%a in ('echo %LUD%') 執行設定 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:\使用者\公用\桌面
2 - 使用「Shell 資料夾」鍵而不是「使用者 Shell 資料夾」。為什麼?因為「shell資料夾」鍵只保存實際路徑,沒有變數。 IOW,從 KEY_NAME 中刪除「使用者」。