【问题标题】:Windows x64 & "parenthesis in path" batch file problemWindows x64 &“路径中的括号”批处理文件问题
【发布时间】:2011-03-21 18:50:16
【问题描述】:

Windows x64 版本包含用括号命名的文件夹,例如“\Program Files (x86)”,这会破坏我使用的批处理文件。问题行示例:

for %%c in (%path%) do if exist "%%c\xyz.exe" set xyz=OK

即当它到达“(x86)”中的“)”时,它会发出一条错误消息并退出......

关于如何解决这个问题的任何想法? 这是一个相当大的批处理文件,atm我没有时间用更好的语言重写它......

非常感谢:)

【问题讨论】:

  • 您确定您复制了非常精确的FOR 指令吗?
  • @PA 是的,我可以重现该错误。我只是想不出一个快速的解决办法。
  • @PA 是的,我只是将可执行文件名称更改为 xyz...
  • 我没有在我的系统中重现错误。也许是语言上的差异?
  • @PA 我正在使用标准的美国英语安装,你是这个意思吗?

标签: windows path batch-file 64-bit parentheses


【解决方案1】:

不直接回答您的问题,但如果您尝试做我认为您正在尝试的事情(即确保路径中存在文件),您可以在批处理文件中使用类似以下内容。

   @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

【讨论】:

  • 创造奇迹... :) 我可以问一下所有 %%~$: 是什么意思吗?非常神秘... ;)
  • @stereo 都记录在 for 的使用中。输入 /?在控制台上。
【解决方案2】:

通常引用应该可以,但在这种情况下,您希望遍历由; 分隔的所有元素。

但是您可以将; 替换为" " 组合,因此括号被引用并且您可以遍历元素。

示例: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
)

【讨论】:

    【解决方案3】:

    您可以为此目的使用文件夹的短名称。你就是这样做的。

    在 Windows 中打开命令提示符。 转到 C 驱动器(或您拥有程序文件夹的驱动器) 键入以下内容并

       c:\> dir /x  <Hit Enter>
    

    这将返回所有文件夹的缩写形式。

    您现在会注意到“\Program Files (x86)”将表示为“PROGRA~2”(或等效的短名称)。 这是我在创建批处理脚本时用来防止任何错误的方法。

    有关更多选项,请参见此处。 http://www.computerhope.com/dirhlp.htm

    “dir /x”的解释
    "这会显示为非 8dot3 文件名生成的短名称。格式是 /N 的格式,短名称插入长名称之前。如果不存在短名称,则在其位置显示空白。"

    【讨论】:

    • OP 的 PATH 环境变量不会使用短名称。
    • 这种方法不会导致他必须遍历所有文件夹,而不仅仅是“路径”环境变量保存的文件夹吗?
    • 这是一种手动方法,违背了“for 语句”的目的以及一般运行批处理文件的目的......
    猜你喜欢
    • 2019-10-31
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    相关资源
    最近更新 更多