如何在批处理文件中转义&符号?

Pet*_*sen 135 windows escaping batch-file

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

双引号不适用start; 这会启动一个新的命令行窗口.

更新1:Wael Dalloul的解决方案有效.此外,如果URL中存在URL编码字符(例如,空格编码为%20)并且它位于批处理文件中,则'%'必须编码为'%%'.在示例中不是这种情况.

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

start http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8
Run Code Online (Sandbox Code Playgroud)

会导致

http://www.google.com/search?client=opera 
Run Code Online (Sandbox Code Playgroud)

在默认浏览器中打开并在命令行窗口中显示以下错误:

'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.
Run Code Online (Sandbox Code Playgroud)

平台:Windows XP 64位SP2.

Wae*_*oul 141

&用于分隔命令.因此你可以^用来逃避&.

  • 怎么样加号?+`我应该把它放在前面以逃避它? (3认同)
  • 使用`^`的一个例子是非常宝贵的. (3认同)
  • @ jpmc26我在[这个答案]中添加了一个例子(http://stackoverflow.com/a/27960888/700926). (2认同)

Las*_*sen 79

从一个cmd:

  • &像这样逃脱:( ^&根据@Wael Dalloul的回答)
  • % 不需要逃脱

一个例子:

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
Run Code Online (Sandbox Code Playgroud)

从批处理文件

  • &像这样逃脱:( ^&根据@Wael Dalloul的回答)
  • %像这样转义:( %%基于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
Run Code Online (Sandbox Code Playgroud)

  • 我还应该转义哪些字符?我注意到我必须转义“ |” 通过“ ^ |”。 (2认同)

bel*_*bob 28

如果提供虚拟的第一个参数,则可以将其括在引号中.

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

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
Run Code Online (Sandbox Code Playgroud)


ada*_*ost 20

explorer "http://www.google.com/search?client=opera&rls=...."
Run Code Online (Sandbox Code Playgroud)

  • 哇也有效.所有这三种方式都有效! (2认同)

Den*_*owe 12

命令

echo this ^& that
Run Code Online (Sandbox Code Playgroud)

按预期工作,输出

this & that
Run Code Online (Sandbox Code Playgroud)

命令

echo this ^& that > tmp
Run Code Online (Sandbox Code Playgroud)

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

echo this ^& that | clip
Run Code Online (Sandbox Code Playgroud)

^被完全不同地解释.它试图将两个命令"echo this"和"that"的输出写入管道.回声将起作用然后"那"将给出错误.话

echo this ^& echo that | clip
Run Code Online (Sandbox Code Playgroud)

将字符串"this"和"that"放在剪贴板上.

没有^:

echo this & echo that | clip
Run Code Online (Sandbox Code Playgroud)

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

要管道&,你必须引用它两次

echo this ^^^& that | clip
Run Code Online (Sandbox Code Playgroud)

如果将字符串放在变量中

set m=this ^& that
Run Code Online (Sandbox Code Playgroud)

然后

set m
Run Code Online (Sandbox Code Playgroud)

将输出

m=this & that
Run Code Online (Sandbox Code Playgroud)

但显而易见的

echo %m%
Run Code Online (Sandbox Code Playgroud)

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

echo this & that
Run Code Online (Sandbox Code Playgroud)

它将此解析为一个新命令并尝试执行"that".

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

setlocal enableDelayedExpansion
echo !m!
Run Code Online (Sandbox Code Playgroud)

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

echo !m:^&=^^^&! | clip
Run Code Online (Sandbox Code Playgroud)

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

cmd /v /c echo !m!
Run Code Online (Sandbox Code Playgroud)

这甚至在写入管道时也有效

cmd /v /c echo !m! | clip
Run Code Online (Sandbox Code Playgroud)

简单.