用批量检查互联网连接

时间:2017-05-13 10:52:33

标签: batch-file variables connection ping

所以最近我的互联网连接确实不能令人满意所以我正在尽可能多地收集关于停机时间和持续时间的数据。我尝试了一些“连接监控”程序,但它们不能按我的意愿工作,所以我决定制作一个。

我是批量的完整菜鸟,但是在过去的一小时里,谷歌搜索的东西我想出了这个:

SET status="

:start_test
timeout 5
ping -n 2 -w 700 www.google.com | find "bytes="
IF %ERRORLEVEL% EQU 0 (
    SET internet=Connected to the internet.

) ELSE (
    SET internet=Not connected to the internet.
)
IF %status%==%internet%(
goto :start_test
) ELSE (
goto :teller 
)

:teller
echo ------------------------------------------
echo %internet%
@echo %time%
echo ------------------------------------------
SET status=%internet%
goto :start_test

tl; dr-它通过google.com检查互联网连接,并在每次互联网连接状态发生变化时写下按摩

但问题是它不起作用我不知道为什么,当我尝试运行它时,控制台打开,经过前几行并自行关闭。

帮助

编辑: 它现在有效,这就是文件现在的样子(就像Mofi所说的那样):

@echo off
SET "status="

:start_test
timeout 5
ping -n 2 -w 700 www.google.com | find "bytes="
IF %ERRORLEVEL% EQU 0 (
    SET internet=Connected to the internet.

) ELSE (
    SET internet=Not connected to the internet.
)
IF "%status%"=="%internet%" (
goto :start_test
) ELSE (
goto :teller 
)

:teller
echo ------------------------------------------
echo %internet%
@echo %time%
echo ------------------------------------------
SET "status=%internet%"
goto :start_test

1 个答案:

答案 0 :(得分:1)

batch file comparison of variable with constant fails上的答案在第一章中解释了如何通过双击而不是来调试批处理文件,而是通过打开命令提示符窗口并从中运行批处理文件窗口,查看由语法错误导致的错误消息,导致退出批处理文件的执行。

SET status="

此行定义环境变量status,其值为"

我想你想用:

SET "status="

此行删除可能存在的环境变量status,但您通过省略第一个双引号将此错误编码。

命令 PING 会在成功时将 ERRORLEVEL 设置为0,而1会出现像目标这样的错误,无法ping通。

但由于某些未知原因,您不想评估 PING 的退出代码,而是通过 FIND PING 的输出>并评估 FIND 的退出代码。

FIND 的使用在我看来完全没必要。

FIND 退出代码的评估已足以继续,具体取决于此退出代码,但根据 ERRORLEVEL的值,将两个带空格的不同字符串分配给环境变量

根据 PING 的退出代码,或多或少地使用 IF 进行分支。

由于语法错误,这是导致退出批处理执行的错误。

IF %status%==%internet%(

将第一次比较扩展为

IF " == Connected to the internet. (

IF " == Not connected to the internet. (

通过输出到控制台的语法错误消息指示的Windows命令解释器无法正确处理这两行,当从命令提示符窗口执行批处理文件时可以读取该行。

比较包含命令分隔符SPACE的字符串需要将两个字符串括起来用双引号进行比较,即使用:

IF "%status%" == "%internet%" (

但即使这样也无济于事,因为环境变量status是用单个双引号定义的,这导致左字符串最终在第一次比较"""上,这又导致语法错误。< / p>

注意:双引号字符包含在字符串比较中。

下面的块也很有趣:

IF %status%==%internet%(
goto :start_test
) ELSE (
goto :teller 
)

:teller

ELSE 分支用于跳转到任何情况下执行的行,如果 ELSE 分支根本不存在的话。所以完整的 ELSE 分支是完全没必要的。

由于上述所有原因,我建议将批处理代码简化为:

@echo off
set "Status=2"
:ConnectionTest
%SystemRoot%\System32\ping.exe -n 2 -w 700 www.google.com >nul
if errorlevel 1 (
    if not "%Status%" == "1" echo %TIME%  Not connected to the internet.
    set "Status=1"
) else (
    if not "%Status%" == "0" echo %TIME%  Connected to the internet.
    set "Status=0"
)
%SystemRoot%\System32\timeout.exe /T 5 >nul
goto ConnectionTest

这里可以省略所有双引号并使用:

@echo off
set Status=2
:ConnectionTest
%SystemRoot%\System32\ping.exe -n 2 -w 700 www.google.com >nul
if errorlevel 1 (
    if not %Status% == 1 echo %TIME%  Not connected to the internet.
    set Status=1
) else (
    if not %Status% == 0 echo %TIME%  Connected to the internet.
    set Status=0
)
%SystemRoot%\System32\timeout.exe /T 5 >nul
goto ConnectionTest

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • echo /?
  • goto /?
  • if /?
  • ping /?
  • set /?
  • timeout /?

另请阅读Microsoft有关using command redirection operators

的文章