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

179

如何在批处理文件(或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

会导致

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。


1
我已经编辑了belugabob的答案,现在应该可以工作了。这只是start中的一个怪癖,如果不加思考地应用,引用参数会失败。总的来说,我认为将参数括在引号中比在其中需要转义每个需要转义的字符更容易且更少出错。 - Joey
1
加号 + 前面应该放什么来转义它? - william
在PowerShell中,start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"可以正常工作,因为PowerShell会去掉引号 - phuclv
8个回答

165

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


4
加号 + 的转义符应该放在它前面,常用的转义符是反斜杠 \ - william
这是更普遍适用的解决方案。如果命令行程序的参数中有一个或多个“&”符号,它也可以工作。我刚遇到了这个问题 - 参数是CGW5COMM&10C4&8301 - Peter Mortensen
6
使用 ^ 的示例将非常有价值。 - jpmc26
2
@jpmc26 我已经在这个答案中添加了一个例子(https://dev59.com/3nM_5IYBdhLWcg3wjj6r#27960888)。 - Lasse Christiansen
“cmd.exe解释命令行的方式与可执行程序解释命令行的方式完全不同且独立。” - Peter Mortensen
显示剩余4条评论

129

从命令提示符(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

从批处理文件中

  • & 应该转义为 ^&(基于 @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

它还可以包括一个转义“%”的示例 - 然后我就可以整理我的问题了。 - Peter Mortensen
@PeterMortensen 当然 - 我已经更新了我的答案。 - Lasse Christiansen
2
我还需要转义哪些字符?我注意到我必须将“|”转义为“^|”。 - liquide
1
在这种情况下,%不需要转义,因为谁会傻到将20and定义为环境变量呢?如果你这样做了,start http://www.google.com/search?q=ampersand%20and%20percentage可能会链接到http://www.google.com/search?q=ampersandsomething-silly20percentage。在cmd中使用^%进行转义,示例将按预期工作。 - TamaMcGlinn

34

如果您提供一个虚拟的第一个参数,您可以用引号将其包裹起来。

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

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

好的,我承认标题并不完全符合里面的问题。(你觉得我应该把标题写长一点吗?) - Peter Mortensen
并不是那么“愚蠢”,加上引号确实是正确的想法——只是不知道控制台窗口标题的问题。感谢Johannes! - belugabob
PowerShell会从参数中删除引号,因此这将失败。您需要在PowerShell上仅使用start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8" - phuclv

21
explorer "http://www.google.com/search?client=opera&rls=...."

18

该命令

echo this ^& that

按预期工作,输出

this & that

该指令

echo this ^& that > tmp

同样有效,将字符串写入文件“tmp”。然而,在使用管道之前,需要先以二进制模式打开文件。
echo this ^& that | clip

符号 ^ 的解释完全不同。它试图将两个命令“echo this”和“that”的输出写入管道。Echo会起作用,然后“That”会出错。表述方式:

echo this ^& echo that | clip

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

没有^的情况下:

echo this & echo that | clip

第一个 echo 命令的输出将会打印到控制台,只有第二个 echo 命令的输出才会被重定向到 clip ("> tmp" 也是同理)。因此,当输出被重定向时,"^" 符号并不代表对 "&" 符号进行引用,而是使其在重定向之前被应用,而不是之后。

如果要重定向 "&" 符号,则需要对其进行两次引用。

echo this ^^^& that | clip

如果您将字符串放在变量中

set m=this ^& that

那么。
set m

将输出

m=this & that

但是显而易见的

echo %m%

该失败是由于Windows替换变量后导致的。

echo this & that

计算机会将其解析为一个新命令,并尝试执行“that”。

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

setlocal enableDelayedExpansion
echo !m!

为了将输出发送到一个管道,我们必须将变量值中的所有 & 替换为 ^& ,我们可以使用 %VAR:FROM=TO% 语法来实现该操作。
echo !m:^&=^^^&! | clip

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

这甚至在向管道写入时也有效。
cmd /v /c echo !m! | clip

简单。

你的管道解决方案是有效的,但你的结论或多或少是错误的。顺便说一下,一个简单的 echo this ^^^& that | clip 也可以工作。为了理解魔法管道处理,你可以阅读 SO: Why does delayed expansion fail when inside a piped block of code? - jeb

1
如果你需要 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

0

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

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

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

^字符用于转义引号。


0

对于特殊字符,如'&',您可以使用引号将整个表达式括起来。

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


不是我点的踩,但这似乎重复了几个旧答案,而且都有更多的细节和解释。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接