我正在测试uncleeat在 this question 提交的这段代码(UncleMeat 引用 this site )当我通过输入一些胡萝卜(^
)对其进行测试时,它产生了一些有趣的结果。
Len.bat
@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%
Len.bat 测试
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?
,我只是简单地返回而不输入任何内容,模式是:
- 0
- 12
- 12
- 1
- 1
- 13
- 13
- 22
- 22
- 13
- 13
- 2
- 2
- 14
- 14
- 23
- 23
- 14
- 14
- 23
- 23
- 14
- 14
- 23
- 23
每一个奇怪的事件都会提示我双倍更多?
,这就是它加倍的原因,但在其他方面这些结果只是奇怪。我以为它必须与代码中的以下行做一些事情,但似乎没有任何关系!
对这个不规则的数据有什么解释吗?或者这只是关于 cmd 的事情之一......
最佳答案
代码完全失败并带有插入符的原因有很多。
首先,您尝试调用批处理的方式将会失败。
插入符号会转义下一个字符,并且本身会从行中删除。
行尾处的单个插入符会转义行尾(称为多行插入符),这就是 cmd.exe 向您显示提示符 More?
的原因。 。
对于所有奇数个插入符都是如此。
带有七个插入符号的示例。
length ^^^^^^^
More?
More?
cmd.exe 将使用以下字符串调用长度 bat ^^^<newline>
.
换行符将从 %1
中分离出来。参数,所以在 %1 中只有 ^^^
.
但是现在你这部分完全失败了
set s=%1
set length=0
当它扩展到 设 s=^^^ 设置长度=0
由于最后一个插入符号现在是多行插入符号,因此它将附加 set length=0
到此为止!
所以在变量 s
中现在的内容是^set length=0
.
这永远行不通......
即使在这个区 block 中,%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
关于batch-file - 使用脚本查找字符串长度的奇怪结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21818298/