^ |应该逃避|字符。
set good=Debug^|Win32
echo Incorrect paramets %good%
pause > nul
为什么这会给我错误?
答案 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