我创建了一个批处理文件,用于在Windows中搜索用户桌面文件夹。
for /F "skip=2 tokens=3* delims= " %%a in ('reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" /v Desktop') do set DESKTOP=%%a
如果我的桌面文件夹不在C:\Users\User\Desktop
中,它将起作用并返回正确的文件夹,例如我的E:\User\Desktop
。如果桌面文件夹位于C:\Users\User\Desktop
,则上述脚本将生成%USERPROFILE%\Desktop
。稍后在脚本中我尝试在桌面上创建一个新文件。在第一个选项中,它将起作用,因为E:\User\Desktop
是一个真实的目录。在第二个中它不会,因为显然%USERPROFILE%\Desktop
不算作目录。
echo start javaw -jar "path/to/program.jar" >"%DESKTOP%\Start program.bat"
如何让它在两种情况下都能正常工作?
否则
if /I "%DESKTOP%" EQU "%USERPROFILE%\Desktop"
没有帮助,因为它与
相同if /I "%DESKTOP%" EQU "C:\Users\User\Desktop"
答案 0 :(得分:2)
您可以使用call
扩展变量:
call set desktop=%desktop%
答案 1 :(得分:2)
您需要额外一轮正常扩展。正如wmz已经回答的那样,你可以通过使用CALL获得额外的回合。
您应该注意在文件夹和文件名中有效的&
或^
等特殊字符。我建议在作业中使用引号来保护特殊字符。
call set "DESKTOP=%DESKTOP%"
我假设DESKTOP的值还没有包含引号。如果您的定义混合有时包含引号,而其他时间不包括引号,则所有投注均已关闭。
假设DESKTOP=This & that\%VAR%
和VAR=& the other thing
。使用CALL引用赋值的最终结果将是正确的:This & that\& the other thing
。
我在现实世界中的文件夹名称中看到&
,因此引号是好事。但是,如果您的值包含^
,则会出现问题。引用^
如果通过CALL加倍。
假设DESKTOP=one^two%var%
和VAR=^three
,使用CALL引用作业的最终结果将为one^^two^three
。
我认为我没有在文件夹名称中遇到^
,但这是可能的,并且有一个解决方案。您可以使用CMD / C进行另一轮扩展,并使用FOR / F来捕获结果。
以下内容将给出one^two^three
的正确结果。我使用"eol=:"
因为有效路径永远不会以:
开头。
for /f "eol=: delims=" %%B in ('cmd /c echo "%DESKTOP%"') do set "DESKTOP=%%~B"
您不需要使用DESKTOP的中间分配。在上述所有情况中,您可以替换FOR / F %%a
代替%DESKTOP%
。