1

^| 应该是逃亡为| 特点。

set good=Debug^|Win32

echo Incorrect paramets %good%

pause > nul

为什么这给我错误?

4

7 回答 7

4

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

set good=Debug^|Win32

或将它们括在引号之间:

set "good=Debug|Win32"

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

setlocal EnableDelayedExpansion
set good=Debug^|Win32
echo Incorrect paramets !good!
pause > nul
于 2013-05-28T16:28:34.913 回答
3

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

正如 James 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%"

但在大多数情况下,不应打印引号。

于 2013-05-28T17:09:08.250 回答
1

尝试使用标签。

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

:ok

是一个标签。

没有必要使用冒号goto

goto ok
goto :ok

是等价的。

于 2013-05-28T16:00:49.717 回答
1

|您正确地将字符转义为set good=Debut^|Win32. 当你echo这样做时,你必须|用转义序列替换字符,如下所示:

@echo off
set good=Debug^|Win32

echo Incorrect paramets %good:|=^|%

pause > nul

这使它成为echo逃逸的管道 ( ^\) 而不是管道到Win32.

于 2013-05-28T16:24:05.057 回答
1

用于set/p输出:

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

输出是:

Incorrect parameters Debug|Win32
于 2013-05-28T20:25:33.147 回答
0

以下按预期工作:

set good=Debug^|Win32

echo "Incorrect parameters %good%"

pause > nul

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

于 2013-05-28T16:15:15.103 回答
0

我会推荐:

echo Incorrect paramets Debug^|Win32
pause > nul
于 2013-05-28T17:07:32.533 回答