【问题标题】:How to set PATH to another variable value with spaces in Windows batch file如何在 Windows 批处理文件中将 PATH 设置为另一个带有空格的变量值
【发布时间】:2010-05-05 07:30:14
【问题描述】:

我遇到了一个 Windows 批处理脚本问题,我对此表示不满(不是双关语)。有问题的脚本如下所示:

if defined _OLD_VIRTUAL_PATH (
    set PATH=%_OLD_VIRTUAL_PATH%
)

当我运行它并设置 _OLD_VIRTUAL_PATH 时,我得到:

\Microsoft was unexpected at this time.

_OLD_VIRTUAL_PATH 是一个最初从PATH 设置的变量,它包含空格——我很确定这就是问题所在。但解决办法是什么?如果我用引号括起来它会成功运行,但我不认为PATH 变量的整个值应该用引号引起来。

【问题讨论】:

    标签: windows scripting batch-file path


    【解决方案1】:

    您的问题不是空格,而是右括号。您可能正在运行一个 64 位系统,其中 32 位应用程序的 Program Files 目录是 Program Files (x86)。在批处理文件的带括号的块中,右括号结束了该块,因此该行的其余部分会导致语法错误。

    您有两种方法可以解决此问题:

    1) 将完整的 set 参数放在引号中。这会导致关闭括号不被识别为块的结尾:

    if defined _OLD_VIRTUAL_PATH (
        set "PATH=%_OLD_VIRTUAL_PATH%"
    )
    

    2) 不要使用块:

    if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH%
    

    【讨论】:

    • 哇——我今天学到了两件事……我确信这种语法会爆炸,但果然,它有效。但是,我不确定为什么 Evgeny 需要它 - 在不使用引号的情况下设置带空格的 PATH 对我来说从来都不是问题。也许 Evgeny 的 _OLD_VIRTUAL_PATH 有一些其他特殊字符(除了空格)需要引用?
    • @Michael:问题不在于空格。我重写了帖子(希望 Chris 不介意;如果需要,他可以回滚)并解释了问题所在和原因。
    • 谢谢 Johannes,我忘记了原因,但这绝对是有道理的。
    • @Johannes:很好。实际上,大约一年前,我在一个用于从文本编辑器中调用各种编译器的脚本中遇到了这个问题。当我在 Win64 机器上使用它时脚本中断了,因为各种 env 变量值(和/或变量名 - 如 ProgramFiles(x86) - 我不记得在名称本身中是否有 ')'是否有问题)。无论如何,我想出的解决问题的方法远没有这个答案中的解决方法那么好(?)。感谢 Chris 和您提供的解决方法和解释。
    • 谢谢,用引号将整个内容括起来!你是对的,我的路径中确实有“C:\ Program Files(x86 \ Microsoft ...”,这一定是问题所在。它实际上是一个多行块,我只是将它简化为一行这篇文章。
    【解决方案2】:

    嗯 - 直到现在我才知道 cmd 脚本中的 defined 操作......

    您的脚本对我来说似乎工作正常 - 究竟是哪一行产生了错误?

    你也可以试试:

    if not "%_OLD_VIRTUAL_PATH%" == "" (
        set PATH=%_OLD_VIRTUAL_PATH%
    )
    

    相信我,如果您进入 Windows cmd 脚本并期望它与您在 bash 中所拥有的一样,那么您很快就会感到非常痛苦。如果 cmd 脚本不是绝对要求,您可能需要考虑使用其他一些脚本语言(PowerShell、Python、PERL - 任何东西)。 cmd 脚本最重要的事情(也许是唯一的事情)是它已经安装在每个 Windows 机器上。

    【讨论】:

    • 命令扩展中有一个“已定义”运算符 - 该行工作正常。失败的是 set 行。
    • set 命令对我来说很好,即使_OLD_VIRTUAL_PATH 中有空格。 _OLD_VIRTUAL_PATH 到底设置了什么?您的脚本格式是否与您在问题中的格式完全相同(cmd.exe 对语法可能非常挑剔,而且并不总是以直观的方式)。
    猜你喜欢
    • 2010-12-14
    • 2013-07-11
    • 2015-10-31
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    相关资源
    最近更新 更多