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

标签 batch-file string-length

我正在测试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?,我只是简单地返回而不输入任何内容,模式是:

  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

每一个奇怪的事件都会提示我双倍更多?,这就是它加倍的原因,但在其他方面这些结果只是奇怪。我以为它必须与代码中的以下行做一些事情,但似乎没有任何关系!

对这个不规则的数据有什么解释吗?或者这只是关于 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/

相关文章:

c++ - constexpr log10 整数函数

database - 备份 sqlite3 数据库

batch-file - 批处理 : Copy files from txt file into one folder

swift - 如何在 Swift 中获取 CString (UTF8String) 的长度?

java - 我试图从字符串中删除奇怪的字符(请检查下面的程序)我收到一个异常

c - 如何找到字符串中每个单词的长度?

batch-file - XCOPY 中带空格的文件夹名称不起作用?

windows - 需要关机脚本 : Check date if Wednesday run batch script

powershell - 从 PowerShell 脚本 block 中的批处理文件返回退出代码

python - 在 Python 中获取 key 的最大长度