windows - 我的批处理文件 (.cmd) 有时会执行部分行

标签 windows batch-file cmd

我有一个奇怪的问题,在我使用批处理文件 30 年的时间里从未遇到过。给定一个像这样的虚拟 CMD 文件:

@echo off
:somelabel
echo Testing something
dir /b
echo All is well.
:end

大部分按预期运行,但有时我得到的输出如'ing something' is not recognized as an internal or external command, operable program or批处理文件。

这显然是它砍掉了一行并试图执行其余部分的情况。发生这种情况时,它始终是“随机”线的“随机”部分;它并不总是 X 行,或丢失 Y 个字符,或出现在我有特定字符组合的地方。它也不只影响 echo 语句,它也可以尝试执行 abelir/b

我的系统是完全更新的 Win2008 R2,运行在 VirtualBox 5.0.2 中,运行在完全升级的 Linux Mint 中,运行在 Lenovo ThinkPad 上。脚本全部采用 UTF-8 编码。

...这是怎么回事?我怎样才能避免这种情况?

最佳答案

嗯,根据我的经验,正常 批处理文件不可能出现这种行为。发生这种情况的唯一方法是批处理文件在运行时被修改,因此 cmd.exe 处理器继续读取批处理文件的“下一行”,但在修改后的文件的那个位置有另一个的一部分线。下面的例子展示了这种行为:

@echo off
:somelabel
(for /F "skip=1 delims=" %%a in (%~NX0) do echo %%a) > temp.tmp
del "%~NX0" & ren temp.tmp "%~NX0"
echo   Testing something
echo All is well.
:end

在这个例子中 del ... & ren ... 行被执行后,下一行要执行的将在 echo Testing something< 的原始位置的开头被读取 行,但现在有它的 ing something 部分,因为第一个 @echo off 行已被删除。看这个:

@echo offRL
echo   Testing something

在前面的方案中,RL 字母代表 CR+LF 控制字符,所以下一个位置是“ing”。

关于windows - 我的批处理文件 (.cmd) 有时会执行部分行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34856786/

相关文章:

windows - 日志文件中的正则表达式匹配,返回匹配上方和下方的动态内容

batch-file - 删除名称以命令提示符(批处理)开头的文件夹

windows - 从同一文件夹中调用另一个 .bat 文件?

java - 该系统找不到指定的文件。在Java中[编写测试时出错]

java - 在关闭远程桌面连接时运行 s/w

windows - Git 配置别名不再起作用

php - PHP 的 SSH 包?

c++ - 我如何链接我的 C++ 控制台应用程序以控制现有控制台?

windows - 为什么控制台输出会阻止自引用批处理脚本干净地退出?

windows - GetVersion/GetVersionEx 已弃用,如何获取 Win8.1 操作系统版本?