我正在测试unclemeat在this question(UncleMeat引用this site)中提交的代码,当我通过输入一些carots(^
来测试它时,它产生了一些有趣的结果。
@echo off
setLocal EnableDelayedExpansion
set s=%1
set length=0
:count
if defined s (
set s=%s:~1%
set /A length += 1
goto count
)
echo %length%
C:\Users\Public>len ^
More?
More?
0
C:\Users\Public>len ^^
12
C:\Users\Public>len ^^^
More?
More?
12
C:\Users\Public>len ^^^^
1
C:\Users\Public>len ^^^^^
More?
More?
1
C:\Users\Public>len ^^^^^^
13
C:\Users\Public>len ^^^^^^^
More?
More?
13
C:\Users\Public>len ^^^^^^^^
22
C:\Users\Public>
忽略我只是在没有输入任何内容的情况下返回的双More?
,模式是:
每一次奇怪的事情都会提示我加倍More?
,这就是为什么它加倍,但其他明智的结果只是奇怪的。我认为它必须在代码中使用以下行做某事,但似乎没有关系!
对此不规则数据的任何解释?或者这只是关于cmd ....
的事情之一答案 0 :(得分:2)
有很多原因导致代码完全失败并带有插入符号 首先,您尝试调用批处理的方式将失败。
一个插入符号逃脱了下一个字符,并且它本身已从该行中删除
行末端的单个插入符号遍历行末尾(称为多行插入符号),这就是为什么cmd.exe会向您显示提示符More?
的原因。
对于所有奇数的插入符都是如此。
七个插入符号的样本。
length ^^^^^^^
More?
More?
cmd.exe将使用以下字符串^^^<newline>
调用长度bat
换行符将从%1
参数中拆分,因此%1仅为^^^
。
但是现在你这部分完全失败了
set s=%1
set length=0
随着它扩展到 设s = ^^^ 设定长度= 0
由于最后一个插入符号现在是多行插入符号,它将追加 set length=0
到该行!
因此,变量s
现在是内容^set length=0
这永远不会奏效......
即使在此区块中,%s:~1%
也会导致进一步的问题,因为当s
包含插入符号时(当使用8个插入符length ^^^^^^^^
时)它也可以扩展为多线插入符号。
if defined s (
set s=%s:~1%
set /A length += 1
goto count
)
有关插入符号的更多解释,请阅读 SO:Long commands split over multiple lines in Vista/DOS batch (.bat) file