以下示例中是否有人能够解释cmd如何处理克拉?
C:\>set ^^=test
C:\>echo %^%
test
C:\>echo ^%^%
test
C:\>echo %^^%
%^%
我认为%^%
只会被处理为%%
。我假设变量扩展是在考虑克拉之前处理的,但对于一个我确信可以更有说服力地解释的问题,这是一个半答案的答案。
批处理 -
@echo off
set ^^=test
echo %^%
echo ^%^%
echo %^^%
-
C:\>test.bat
test
test
ECHO is off.
答案 0 :(得分:3)
这是因为Batch处理每个命令行的顺序。简单地说,在分析特殊字符之前执行变量扩展。这就是为什么克拉在被作为转义字符移除之前被变量扩展所消耗的原因。这也是百分比字符必须由自己%%
而不是标准克拉^
转义符转义的原因。
相位/顺序
1)阶段(百分比):
- 双
取代%%
被单个%
- 扩展参数变量(
%1
,%2
等)- 扩展
%var%
,如果var不存在则将其替换为- 有关完整说明,请参阅dbenham Same thread: percent expansion
1.5)从行中删除所有
<CR>
(CarriageReturn 0x0d)2)阶段(特殊字符,
"
<LF>
^
&
|
<
>
{{ 1}}(
:查看每个字符
- 如果是引号(
)
)切换引号标志,如果引号标志处于活动状态,则以下特殊字符不再特殊:"
^
{{1} }&
|
<
>
。- 如果是插入符号(
(
),则下一个字符没有特殊含义,插入符号本身将被删除,如果插入符号是该行的最后一个字符,则附加下一行,即第一个字符。下一行始终作为转义字符处理。
)
立即停止解析,但前面没有插入符号
要获得完整而精彩的解释(请仔细标记此链接!),请在此处查看答案:
答案 1 :(得分:3)
除了David Ruhrmann的回答......
您创建一个名为^
的变量,因为解析器将转义第二个插入符并删除语句set ^^=test
中的第一个插入符号。
正如David解释的那样,扩展阶段的百分比是第一阶段,所以它甚至可以扩展像<CR>
字符这样的奇怪表达,但这也是你无法建立多行百分比扩展的原因。
首先,百分比被扩大(并且因为只有一个而失败),然后使用mutliline插入符号来附加下一行。
echo %va^
r%
但真正令人困惑的是下一个插入符号
set "^=one caret"
set "^^=two carets"
echo "%^%"
call echo "%%^%%"
输出
"one caret"
"two carets"
这是因为插入符号会被CALL