0

我创建了一个在 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"
4

2 回答 2

2

您可以使用call扩展变量:
call set desktop=%desktop%

于 2012-10-06T15:39:41.830 回答
2

你需要一轮额外的正常扩展。正如 wmz 已经回答的那样,您可以使用 CALL 获得额外的一轮。

您应该注意文件夹和文件名中有效的特殊字符,例如&or 。^我建议在作业中使用引号来保护特殊字符。

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%.

于 2012-10-06T16:39:47.243 回答