^ |上的批处理字符转义不工作

时间:2013-05-28 15:38:07

标签: windows batch-file

^ |应该逃避|字符。

set good=Debug^|Win32

echo Incorrect paramets %good%

pause > nul

为什么这会给我错误?

7 个答案:

答案 0 :(得分:4)

您有两种方法可以在变量中插入特殊字符。逃避他们:

set good=Debug^|Win32

或将它们括在引号之间:

set "good=Debug|Win32"

但是,正确显示包含特殊字符的变量值的唯一方法是使用延迟扩展:

setlocal EnableDelayedExpansion
set good=Debug^|Win32
echo Incorrect paramets !good!
pause > nul

答案 1 :(得分:3)

我尝试为主要问题添加一些解释。

正如詹姆斯L.所说,你的变量中有预期的内容,但回应它是有问题的。

echo Incorrect parameters %good:|=^|%

这是解析器的问题 在扩展百分比之后,如果特殊字符没有被插入符号或引号转义,则将解析特殊字符。

James L.的方式仅在管道中有效,但变量中没有其他特殊字符,因为您不能以这种方式替换两个不同的字符。

但你可以两次逃脱所有特殊字符,例如:

set good=Debug^^^|Win32^^^&Ampersand
echo Incorrect parameters %good%

或相同的

set "good=Debug^|Win32^&Ampersand"
echo Incorrect parameters %good%

这样做有效,但好的内容是Debug^|Win32^&Ampersand,大多数情况下不需要。

Aacini的方式,使用延迟扩展始终与任何内容一起工作,因为在延迟扩展之后内容将不会被进一步解析,因此特殊字符是无害的。
这是扩张百分比延迟扩张的主要优势之一。

还有另一种方法可以使用像Axel Kemper解决方案这样的引用。

echo "Incorrect parameters %good%"

但在大多数情况下,不应打印报价。

答案 2 :(得分:1)

尝试使用标签。

批处理时,标签前面有冒号。

:ok

是一个标签。

没有必要在goto

中使用冒号
goto ok
goto :ok

是等价的。

答案 3 :(得分:1)

您通过|正确转义了set good=Debut^|Win32个字符。当你echo它时,你必须用转义序列替换|字符,如下所示:

@echo off
set good=Debug^|Win32

echo Incorrect paramets %good:|=^|%

pause > nul

这使得echo转义管道(^\)而不是将其管道传输到Win32

答案 4 :(得分:1)

使用set/p输出:

@echo off&setlocal
set "good=Debug|Win32"
<nul set/p"=Incorrect parameters %good%"
echo(

输出是:

Incorrect parameters Debug|Win32

答案 5 :(得分:0)

以下按预期方式工作:

set good=Debug^|Win32

echo "Incorrect parameters %good%"

pause > nul

如果省略echo语句中的引号,Windows会尝试执行“Win32”,这是不可能的。

答案 6 :(得分:0)

我建议:

echo Incorrect paramets Debug^|Win32
pause > nul