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


146

我如何在批处理文件中(或从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如果不加考虑就应用引号会失败。总的来说,我认为将参数括在引号中比逃避每个需要转义的字符更容易且更不容易出错。
乔伊,

加号+该怎么办?
威廉2012年

在PowerShell中start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"运行是因为PowerShell将删除引号
phuclv

Answers:


91

从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一定-我已经更新了我的答案。
拉西克里斯蒂

2
我还应该逃避哪些字符?我注意到我必须转义“ |” 通过“ ^ |”。
Liquide 2015年

在这种情况下%,不需要逃避,因为谁会愚蠢地将其定义20and为环境变量?如果您这样做,start http://www.google.com/search?q=ampersand%20and%20percentage可以链接到http://www.google.com/search?q=ampersandsomething-silly20percentage。通过使用^%cmd进行转义,该示例按预期工作。
TamaMcGlinn

145

&用于分隔命令。因此,您可以使用^来逃脱&


3
加号+该怎么办?
威廉2012年

这是更通用的解决方案。如果命令行程序的参数中包含一个或多个“与”号,则它也可以工作。我刚刚遇到了这个-参数是CGW5COMM&10C4&8301
彼得·莫滕森

用尖号字符^括起来的符号似乎并非在所有情况下都有效。例如,尝试使用/ p:开关执行msdeploy.exe以使用与号传递密码,这似乎不适用于我尝试过的任何排列方式(尖号,双引号,虚拟第一个参数)。
德里克·格里尔

3
一个使用示例^将是无价的。
jpmc26 2015年

2
@ jpmc26我在此答案中添加了一个示例。
Lasse Christiansen

29

如果提供了第一个伪参数,则可以将其括在引号中。

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

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

好的,我承认标题与里面的问题不完全匹配。(您认为我应该延长头衔吗?)
Peter Mortensen

毕竟不是'Doh'-引号是正确的主意-只是不知道控制台窗口标题。谢谢约翰尼斯!
belugabob

PowerShell将删除参数中的引号,因此将失败。您只需要start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"在PowerShell 上使用
phuclv


12

命令

echo this ^& that

按预期工作,输出

this & that

命令

echo this ^& that > tmp

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

echo this ^& that | clip

^的解释完全不同。它尝试将两个命令“ echo this”和“ that”的输出写入管道。回声将起作用,然后“ 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

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

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

setlocal enableDelayedExpansion
echo !m!

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

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

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

cmd /v /c echo !m!

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

cmd /v /c echo !m! | clip

简单。


您的管道解决方案可行,但您的结论或多或少是错误的。顺便说一句。一个简单的echo this ^^^& that | clip作品。要了解魔术管道的处理,您可以阅读SO:为什么在管道代码块中延迟扩展失败?
jeb 2016年

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"' .

^否则,字符将转义。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.