2014-04-04 55 views
4

有人能够解释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. 

回答

3

这是因为批量如何处理每个命令行的顺序。简而言之,在分析特殊字符之前执行可变扩展。这就是为什么克拉在被作为转义字符移除之前被变量扩展消耗掉的原因。这也是为什么百分号字符必须自己转义%%而不是标准克拉^转义字符。

相位/顺序

1)相位(百分比):

  • %%由参数变量(%1%2等的单个%
  • 扩展替换)
  • 扩展%var%,如果var不存在替换i吨,没什么
  • 有关完整的说明,从dbenham阅读本Same thread: percent expansion

1.5)从行删除所有<CR>(回车符0X0D)

2)第二阶段(特殊字符,"<LF>^&|<>()看看每个字符

  • 如果它是一个引号(")切换报价标志,如果报价标志有效,下列特殊字符不再特殊:^&|<>()
  • 如果是插入符号(^),则下一个字符没有特殊含义,如果插入符号是该行的最后一个字符,则附加下一行,下一行的第一个字符为始终处理为转义字符。
    • <LF>立即停止了解析,而不是在前面

一个插入符,对于一个完整的和很好的解释在这里看到的答案(认真收藏此链接!):

3

此外大卫Ruhrmann的答案...

您创建一个名为^变量,解析器将难逃第二插入符号,并删除在声明set ^^=test第一个。

正如David解释的那样,百分比扩展阶段是第一阶段,因此它可以扩展奇怪的表达式,如<CR>字符,但这也是导致无法构建多行百分比扩展的原因。
首先百分比被扩大(并且因为只有一个而失败),然后使用多重线符号附加下一行。

echo %va^ 
r% 

但真正令人困惑的是下一个插入符例如

set "^=one caret" 
set "^^=two carets" 
echo "%^%" 
call echo "%%^%%" 

输出是

"one caret" 
"two carets" 

这是因为插入符号将由CALL

+0

+1加倍对于伟大解释'set'命令,并添加与克拉的呼叫命令行为。 –