【问题标题】:How do I escape ampersands in batch files?如何在批处理文件中转义 & 符号?
【发布时间】:2010-11-22 13:58:26
【问题描述】:

如何在批处理文件(或从 Windows 命令行),以便使用start 命令 打开 URL 中带有 & 符号的网页?

双引号不适用于start;这开始了一个新的 而是命令行窗口。

更新 1:Wael Dalloul 的解决方案有效。此外,如果 有 URL 编码的字符(例如,空格被编码为 %20) 在 URL 中并且 它在一个批处理文件中 那么 '%' 必须是 编码为“%%”。示例中并非如此。

例如,来自命令行 (CMD.EXE):

start http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8

将导致

http://www.google.com/search?client=opera 

在默认浏览器中打开并且在命令行窗口中出现这些错误:

'rls' is not recognized as an internal or external command,
operable program or batch file.
'q' is not recognized as an internal or external command,
operable program or batch file.
'sourceid' is not recognized as an internal or external command,
operable program or batch file.
'ie' is not recognized as an internal or external command,
operable program or batch file.
'oe' is not recognized as an internal or external command,
operable program or batch file.

平台:Windows XP 64 位 SP2。

【问题讨论】:

  • 我已经编辑了 belugabob 的答案,所以它现在应该可以工作了。这只是start 中的一个怪癖,如果不加思索地应用,它会导致引用参数失败。总的来说,我认为将参数括在引号中比在其中转义每个需要转义的字符更容易且更不容易出错。
  • 加号+前面应该加什么来逃避呢?
  • 在 PowerShell 中 start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8" 有效,因为 PowerShell will strip quotes out

标签: windows batch-file cmd escaping ampersand


【解决方案1】:

如果你提供一个虚拟的第一个参数,你可以用引号将它括起来。

请注意,在这种情况下,您需要提供一个虚拟的第一个参数,因为start 会将第一个参数视为新控制台窗口的标题(如果它被引用)。所以以下应该有效(并且在这里有效):

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"

【讨论】:

  • 好的,我承认标题与里面的问题不完全相符。 (你认为我应该把标题加长吗?)
  • 毕竟不是'Doh' - 用引号括起来是正确的想法 - 只是不知道控制台窗口标题的事情。谢谢约翰内斯!
  • PowerShell will strip quotes from the arguments,所以这将失败。您只需要在 PowerShell 上使用 start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
【解决方案2】:
explorer "http://www.google.com/search?client=opera&rls=...."

【讨论】:

    【解决方案3】:

    & 用于分隔命令。因此,您可以使用^ 转义&

    【讨论】:

    • 加号+前面应该加什么来逃避呢?
    • 这是更通用的适用解决方案。如果命令行程序的参数中有一个或多个&符号,它也可以工作。我刚遇到这个-参数是CGW5COMM&10C4&8301
    • 用插入符号 ^ 引用 & 符号似乎并不适用于所有情况。例如,尝试使用 /p: 开关执行 msdeploy.exe 以通过与符号传递密码似乎不适用于我尝试过的任何排列(插入符号引号、双引号、虚拟第一个参数)。
    • 一个使用^的例子将是非常宝贵的。
    • @jpmc26 我添加了一个示例in this answer
    【解决方案4】:

    来自 cmd

    • & 转义如下:^&(基于@Wael Dalloul 的answer
    • % 不需要转义

    一个例子:

    start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%20and%20percentage+in+cmd^&sourceid=opera^&ie=utf-8^&oe=utf-8
    

    来自批处理文件

    • & 转义如下:^&(基于@Wael Dalloul 的answer
    • % 转义如下:%%(基于 OP 更新)

    一个例子:

    start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%%20and%%20percentage+in+batch+file^&sourceid=opera^&ie=utf-8^&oe=utf-8
    

    【讨论】:

    • 它还可以包含一个转义“%”的示例 - 然后我可以清理我的问题。
    • @PeterMortensen 绝对 - 我已经更新了我的答案。
    • 我还应该转义哪些字符?我注意到我必须逃避“|”通过“^|”。
    • 在这种情况下% 不需要转义,因为谁会傻到将20and 定义为环境变量?如果你这样做了,start http://www.google.com/search?q=ampersand%20and%20percentage 可以链接到http://www.google.com/search?q=ampersandsomething-silly20percentage。在cmd中使用^%转义,示例按预期运行。
    【解决方案5】:

    命令

    echo this ^& that
    

    按预期工作,正在输出

    this & that
    

    命令

    echo this ^& that > tmp
    

    也可以,将字符串写入文件“tmp”。但是,在管道之前

    echo this ^& that | clip
    

    ^ 的解释完全不同。它尝试将“echo this”和“that”这两个命令的输出写入管道。回声将起作用,然后“那个”将给出错误。说

    echo this ^& echo that | clip
    

    会将字符串“this”和“that”放在剪贴板上。

    没有 ^:

    echo this & echo that | clip
    

    第一个回显将写入控制台,只有第二个回显的输出将通过管道传输到剪辑(类似于“> tmp”重定向)。因此,当输出被重定向时,^ 不引用 & 而是导致它在重定向之前而不是之后应用。

    要使用 &,你必须引用它两次

    echo this ^^^& that | clip
    

    如果将字符串放入变量中

    set m=this ^& that
    

    然后

    set m
    

    会输出

    m=this & that
    

    但显而易见

    echo %m%
    

    失败是因为,Windows 替换了变量后,导致

    echo this & that
    

    它将 this 解析为一个新命令并尝试执行“that”。

    在批处理文件中,可以使用延迟扩展

    setlocal enableDelayedExpansion
    echo !m!
    

    要输出到管道,我们必须用 ^& 替换变量值中的所有 &,这可以使用 %VAR:FROM=TO% 语法来完成:

    echo !m:^&=^^^&! | clip
    

    在命令行中,“cmd /v”启用延迟扩展:

    cmd /v /c echo !m!
    

    即使在写入管道时也可以使用

    cmd /v /c echo !m! | clip
    

    简单。

    【讨论】:

    【解决方案6】:

    如果您需要echo 包含与号的字符串,引号将无济于事,因为您也会在输出中看到它们。在这种情况下,请使用for

    for %a in ("First & Last") do echo %~a
    

    ...在批处理脚本中:

    for %%a in ("First & Last") do echo %%~a
    

    for %%a in ("%~1") do echo %%~a
    

    【讨论】:

      【解决方案7】:

      如果你的文件名中有空格并且你有一个你需要转义的字符:

      您可以使用单引号和双引号来避免命令中的任何误用。

      scp ./'files name with spaces/internal folder with spaces/"text & files stored.txt"' .
      

      ^ 字符否则会转义引号。

      【讨论】:

        【解决方案8】:

        对于像“&”这样的特殊字符,您可以用引号将整个表达式括起来

        set "url=https://url?retry=true&w=majority"

        【讨论】:

        • 不是我的反对意见,但这似乎重复了几个较旧的答案,都有更多细节和解释。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-21
        • 2012-10-10
        • 1970-01-01
        • 2021-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多