为啥这个 CMD .bat 文件会停止?

Posted

技术标签:

【中文标题】为啥这个 CMD .bat 文件会停止?【英文标题】:Why is this CMD .bat file stopping?为什么这个 CMD .bat 文件会停止? 【发布时间】:2021-09-30 23:13:10 【问题描述】:

我编写了一个简单的 .bat 文件来监控我的 PC 和 Google 之间的 ping(试图大致监控网络的健康状况,并记录任何丢失的情况)。

以下是在一个名为 Pingtest.bat 的文件中

@ECHO OFF

:LOOPSTART

FOR /F "tokens=* USEBACKQ" %%i IN ('%DATE:~0% %TIME:~0,8%') DO (SET "TIMED=%%i")

FOR /F "tokens=* USEBACKQ" %%g IN (`ping -n 1 -w 10000 www.google.co.uk`) do (SET "PING=%%g")
FOR /F "tokens=3 delims=," %%a in ("%PING%") do (set AVG_PING=%%a)
SET AVG_PING=%AVG_PING:~11,-2%

set /a varCheck=%AVG_PING%
IF %VarCheck%==%AVG_PING% (goto :OUTPUT) else (goto :ERROR)
:ERROR
SET AVG_PING=ERROR

:OUTPUT
SET OUTPUT=%TIMED% %AVG_PING%

echo %OUTPUT% >> Pingtest.txt
set "TIMED="
set "PING="
set "AVG_PING="
set "varCheck="

timeout /t 5 /nobreak > NUL

GOTO LOOPSTART

每 5 秒,这会输出一个时间戳和以毫秒为单位的 ping 结果(例如23/07/2021 23:35:40 15)并将其附加到 Pingtest.txt 文件中。这应该无限期地运行。

此 .bat 文件通过 .vbs 文件执行,该文件在启动时执行 .bat 静默执行 (code from this post)。

问题是我希望这段代码无限期地运行,直到用户会话结束(关闭/注销),但代码似乎在约 350 次执行(约 30 分钟)后自行停止)。这有什么原因吗,是否可以绕过/解决这个问题,使代码可以无限期运行?

附:完全意识到这可能是写得很糟糕的代码,因此欢迎任何反馈/改进。

谢谢

【问题讨论】:

对服务器进行 Ping 仅提供了将消息跳到该特定服务器并可能从该特定服务器接收响应所用时间的指示。它不会为您提供网络健康状况的任何指示。 我已经运行你的脚本一个小时了,它仍然可以正常工作。尝试从命令行运行您的脚本,而不是双击该脚本,然后查看您收到的错误消息。 【参考方案1】:
IF %VarCheck%==%AVG_PING% (goto :OUTPUT) else (goto :ERROR)

这是问题的核心。如果 DNS 查找或 ping 彻底失败,VarCheck 最终为空,则此行被无意义地解析,最终结果是批处理文件的其余部分被忽略。将其更改为:

IF [%VarCheck%]==[%AVG_PING%] (goto :OUTPUT) else (goto :ERROR)

将处理VarCheck 为空的情况。

【讨论】:

最佳做法是使用if "%VarCheck%"=="%AVG_PING%" … 之类的引号,因为它们还可以保护空格和其他特殊字符……

以上是关于为啥这个 CMD .bat 文件会停止?的主要内容,如果未能解决你的问题,请参考以下文章

通过 .bat 在已打开的 CMD 中插入命令

Windows 上的 Python 子进程:启动子进程“cmd.exe”并为其提供 bat 文件,停止主进程执行

通过批处理或 cmd 文件停止和启动服务?

在我调用 r.exec 以启动 cmd 提示符后如何停止执行我的 java 程序

为啥 React Native iOS 模拟器的重新加载快捷方式有时会停止工作?

cmd启动和停止tomcat