我的问题:我需要将指向各种 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”。