变量内变量?

时间:2012-10-06 14:24:25

标签: windows variables batch-file

我创建了一个批处理文件,用于在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"

2 个答案:

答案 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%