將系統變數傳遞到另一個變數中

將系統變數傳遞到另一個變數中

我的問題:我需要將特定圖示複製到指向各種 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 中刪除「使用者」。

相關內容