在另一个变量内传递系统变量

在另一个变量内传递系统变量

我的问题:我需要将指向各种 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在('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:\users\public\desktop

2 - 使用“Shell Folder”键而不是“User Shell Folder”。为什么?因为“shell folder”键仅包含实际路径,没有变量。换句话说,从 KEY_NAME 中删除“user”。

相关内容