Windows x64 版本包含用括号命名的文件夹,例如“\Program Files (x86)”,这会破坏我使用的批处理文件。问题行的示例:
for %%c in (%path%) do if exist "%%c\xyz.exe" set xyz=OK
即当它到达“(x86)”中的“)”时,它会发出一条错误消息并退出......
有想法该怎么解决这个吗?这是一个相当大的批处理文件,atm 我没有时间用更好的语言重写它......
非常感谢 :)
Windows x64 版本包含用括号命名的文件夹,例如“\Program Files (x86)”,这会破坏我使用的批处理文件。问题行的示例:
for %%c in (%path%) do if exist "%%c\xyz.exe" set xyz=OK
即当它到达“(x86)”中的“)”时,它会发出一条错误消息并退出......
有想法该怎么解决这个吗?这是一个相当大的批处理文件,atm 我没有时间用更好的语言重写它......
非常感谢 :)
不直接回答您的问题,但如果您尝试做我认为您正在尝试的事情(确保路径中存在文件),您可以在批处理文件中使用类似以下内容。
@echo off
for %%i in (xyz.exe) do set xyz=%%~$PATH:i
if "%xyz%" == "" Goto NotFound
Echo "Found"
Goto TheEnd
:NotFound
Echo "Not found"
:TheEnd
通常引用应该有效,但在这种情况下,您希望遍历所有由 . 分隔的元素;
。
但是您可以将 替换;
为" "
组合,因此括号被引用并且您可以遍历元素。
示例:path=C:\temp;C:\windows;C:\Program Files (x86)
for 循环将在
"C:\temp" "C:\windows" "C:\Program Files (x86)"
作为代码,它看起来像
setlocal EnableDelayedExpansion
set "searchPath=!path:;=" "!"
for %%c in ("!searchPath!") do (
if exist "%%~c\xyz.exe" set xyz=OK
)
为此,您可以使用文件夹的短名称。这就是你的做法。
在 Windows 中打开命令提示符。转到 C 驱动器(或您拥有程序文件夹的驱动器)键入以下内容并
c:\> dir /x <Hit Enter>
这将返回所有文件夹的缩写形式。
您现在会注意到“\Program Files (x86)”将表示为“PROGRA~2”(或等效的短名称)。这是我在创建批处理脚本时用来防止任何错误的方法。
有关更多选项,请参见此处。 http://www.computerhope.com/dirhlp.htm
Exlpanation for "dir /x"
"这显示为非 8dot3 文件名生成的短名称。格式是 /N 的格式,短名称插入长名称之前。如果不存在短名称,则在其中显示空白地方。”