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

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

双引号在 start中不起作用; 这将启动一个新的 命令行窗口。

更新1 : Wael Dalloul 的解决方案工作正常 有 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.

平台: WindowsXP64位 SP2。

138953 次浏览

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

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

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

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

来自 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 的 回答)
  • %是这样转义的: %%(基于 OPs 更新)

举个例子:

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

命令

echo this ^& that

工作正常,输出正常

this & that

命令

echo this ^& that > tmp

也可以工作,将字符串写入文件“ tmp”

echo this ^& that | clip

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

echo this ^& echo that | clip

将字符串“这个”和“那个”放在剪贴板上。

没有 ^ :

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

很简单。

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

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

可以使用单引号 AND 双引号来避免命令中的任何错误命名。

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

否则,^字符将转义引号。

对于“ &”这样的特殊字符,可以用引号围绕整个表达式

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