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

时间:2009-08-25 10:39:11

标签: windows batch-file escaping

如何在批处理文件中(或从文件中)转义&符号 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。

8 个答案:

答案 0 :(得分:137)

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

答案 1 :(得分:68)

从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

答案 2 :(得分:26)

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

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

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

答案 3 :(得分:19)

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

答案 4 :(得分:12)

命令

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

第一个echo将写入控制台,只有第二个echo的输出将通过管道传输到剪辑(类似于“> 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

简单。

答案 5 :(得分:1)

如果你需要$_POST['userSelect']一个包含&符号的字符串,引号也无济于事,因为你也会在输出中看到它们。在这种情况下,请使用$_POST['userSelect']

echo

...在批处理脚本中:

for

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

答案 6 :(得分:0)

如果您在文件名中有空格,则需要转义一个字符:

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

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

^字符否则会转义引号。

答案 7 :(得分:-1)

对于诸如'&'之类的特殊字符,您可以在整个表达式前后加上引号

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