奇怪的结果使用脚本来查找字符串的长度?

时间:2014-02-16 23:32:09

标签: batch-file string-length

我正在测试unclemeat在this question(UncleMeat引用this site)中提交的代码,当我通过输入一些carots(^来测试它时,它产生了一些有趣的结果。

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?,模式是:

  1. 0
  2. 12
  3. 12
  4. 1
  5. 1
  6. 13
  7. 13
  8. 22
  9. 22
  10. 13
  11. 13
  12. 2
  13. 2
  14. 14
  15. 14
  16. 23
  17. 23
  18. 14
  19. 14
  20. 23
  21. 23
  22. 14
  23. 14
  24. 23
  25. 23
  26. 每一次奇怪的事情都会提示我加倍More?,这就是为什么它加倍,但其他明智的结果只是奇怪的。我认为它必须在代码中使用以下行做某事,但似乎没有关系!

    对此不规则数据的任何解释?或者这只是关于cmd ....

    的事情之一

1 个答案:

答案 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