Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 使用Bat文件进行Ping测试-errorlevel出现问题_Batch File_Ping - Fatal编程技术网

Batch file 使用Bat文件进行Ping测试-errorlevel出现问题

Batch file 使用Bat文件进行Ping测试-errorlevel出现问题,batch-file,ping,Batch File,Ping,我正在使用批处理文件设置LAN ping测试。我的代码对网站很有用,但对本地IP来说却很奇怪。我正在3台我知道IP的计算机上运行ping测试。无论我拔下哪个,当我运行下面的代码时,所有三台计算机上的%errorlevel%始终为0。它永远不会像在网站上那样等于1。我如何解决这个问题 @echo off cls Set IPaddress=www.google.com PING %IPaddress% -n 1 call :PingTest Set IPaddress=www.yahoo.co

我正在使用批处理文件设置LAN ping测试。我的代码对网站很有用,但对本地IP来说却很奇怪。我正在3台我知道IP的计算机上运行ping测试。无论我拔下哪个,当我运行下面的代码时,所有三台计算机上的%errorlevel%始终为0。它永远不会像在网站上那样等于1。我如何解决这个问题

@echo off
cls
Set IPaddress=www.google.com
PING %IPaddress% -n 1
 call :PingTest

Set IPaddress=www.yahoo.com
PING %IPaddress% -n 1
 call :PingTest

Set IPaddress=www.unabletoping.com
PING %IPaddress% -n 1
 call :PingTest

pause > null
exit

:PingTest
IF %errorlevel% EQU 1 (echo "Server is Offline") else (GOTO:EOF)

虽然我无法复制您的问题,但我确实对您的脚本有一些建议。(有关该问题的问题,请参见我的评论)

  • 创建变量时封装范围
    setlocal
    endlocal
  • 退出脚本时,使用/b标志作为不终止调用方的命令提示符
  • nul不为空
  • 示例():

    @echo关闭
    setlocal
    cls
    设置“IPaddress=www.google.com”
    调用:PingVerbose“%IPaddress%”
    电话:PingVerbose“www.yahoo.com”
    电话:PingVerbose“www.microsoft.com”
    暂停>nul
    端部
    退出/b0
    :Ping
    ping“%~1”-n1>nul
    退出/b%ErrorLevel%
    :ping冗长
    呼叫:Ping%1&&echo%1处于联机状态| | echo%1处于脱机状态
    退出/b%ErrorLevel%
    
    虽然我无法复制您的问题,但我确实对您的脚本有一些建议。(有关该问题的问题,请参见我的评论)

  • 创建变量时封装范围
    setlocal
    endlocal
  • 退出脚本时,使用/b标志作为不终止调用方的命令提示符
  • nul不为空
  • 示例():

    @echo关闭
    setlocal
    cls
    设置“IPaddress=www.google.com”
    调用:PingVerbose“%IPaddress%”
    电话:PingVerbose“www.yahoo.com”
    电话:PingVerbose“www.microsoft.com”
    暂停>nul
    端部
    退出/b0
    :Ping
    ping“%~1”-n1>nul
    退出/b%ErrorLevel%
    :ping冗长
    呼叫:Ping%1&&echo%1处于联机状态| | echo%1处于脱机状态
    退出/b%ErrorLevel%
    
    虽然我也无法复制您的问题,但我也有一个改进脚本的建议-

    @echo off & cls
    
    set addresses=10.1.1.666 10.124.412.14 10.7.254.1
    
    for %%a in (%addresses%) do ping %%a -n 1 > nul || echo %%a is offline
    

    请注意,
    |
    之后的命令只有在ping设置了错误级别时才会执行。

    尽管我也无法复制您的问题,我也有一个改进脚本的建议-

    @echo off & cls
    
    set addresses=10.1.1.666 10.124.412.14 10.7.254.1
    
    for %%a in (%addresses%) do ping %%a -n 1 > nul || echo %%a is offline
    

    请注意,
    |
    之后的命令只有在ping设置了错误级别时才会执行。

    当您ping子网中的不可访问地址时,您会得到一个“无法访问”的答案,发送1个数据包,接收1个打包数据包,丢失0个数据包。未设置错误级别


    当您将一个不可访问的地址ping出子网时,您会得到一个“超时”应答,发送1个数据包,接收0个数据包,丢失1个数据包。已设置错误级别

    并且,您可以ping活动机器,丢失数据包并获得错误级别

    并且,您可以ping一台活动/非活动机器,使TTL过期,并获得无错误级别

    最好检查ping响应的内容

    ping -n 1 192.168.1.1 | find "TTL=" >nul
    if errorlevel 1 (
        echo host not reachable
    ) else (
        echo host reachable
    )
    

    当您在子网中ping一个不可访问的地址时,您会得到一个“不可访问”的答案,发送1个数据包,接收1个数据包,丢失0个数据包。未设置错误级别


    当您将一个不可访问的地址ping出子网时,您会得到一个“超时”应答,发送1个数据包,接收0个数据包,丢失1个数据包。已设置错误级别

    并且,您可以ping活动机器,丢失数据包并获得错误级别

    并且,您可以ping一台活动/非活动机器,使TTL过期,并获得无错误级别

    最好检查ping响应的内容

    ping -n 1 192.168.1.1 | find "TTL=" >nul
    if errorlevel 1 (
        echo host not reachable
    ) else (
        echo host reachable
    )
    

    考虑到其他人所提到的,我想展示一个人可能需要如何完成上面所示的一切,以及如何使用修改过的变量,例如循环中的计数器

    注意:使用“setlocal enabledelayedexpansion”允许在循环等中使用修改过的变量

    @echo off
    setlocal enabledelayedexpansion
    
    REM List of systems to check
    set list=www.google.com www.yahoo.com www.notasite.com
    
    set /a failed=0
    set /a passed=0
    set /a count=0
    
    echo PingTest Servers on %list% :
    
    (for %%a in (%list%) do ( 
        set /a "count+=1"
        call :PingVerbose %%a && set /a "passed=!passed!+1" || set /a "failed=!failed!+1"
    ))
    
    echo ------------
    echo Result: %passed% of %count% systems are pingable
    pause
    endlocal
    exit /b 0
    
    :Ping <Address>
    ping "%~1" -n 1 >NUL
    exit /b %ErrorLevel%
    
    :PingVerbose <Address>
    call :Ping %1 && echo %~1 - [ONLINE] || echo %~1 - [OFFLINE] 
    exit /b %ErrorLevel%
    

    考虑到其他人所提到的,我想展示一个人可能需要如何完成上面所示的一切,以及如何使用修改过的变量,例如循环中的计数器

    注意:使用“setlocal enabledelayedexpansion”允许在循环等中使用修改过的变量

    @echo off
    setlocal enabledelayedexpansion
    
    REM List of systems to check
    set list=www.google.com www.yahoo.com www.notasite.com
    
    set /a failed=0
    set /a passed=0
    set /a count=0
    
    echo PingTest Servers on %list% :
    
    (for %%a in (%list%) do ( 
        set /a "count+=1"
        call :PingVerbose %%a && set /a "passed=!passed!+1" || set /a "failed=!failed!+1"
    ))
    
    echo ------------
    echo Result: %passed% of %count% systems are pingable
    pause
    endlocal
    exit /b 0
    
    :Ping <Address>
    ping "%~1" -n 1 >NUL
    exit /b %ErrorLevel%
    
    :PingVerbose <Address>
    call :Ping %1 && echo %~1 - [ONLINE] || echo %~1 - [OFFLINE] 
    exit /b %ErrorLevel%
    

    局域网上的每台计算机都分配了静态IP还是动态IP?DHCP打开了吗?如果是这样,我建议使用计算机名,而不是他们的IP地址<代码>ping通过这种方式,您正在查找特定的计算机,而不是分配该IP地址的任何设备。使用dynamics进行测试时,我计划运行的计算机将处于静态状态。我想使用IP,以防在任何时候出现名称解析问题。局域网上的每台计算机都被分配了静态IP还是动态IP?DHCP打开了吗?如果是这样,我建议使用计算机名,而不是他们的IP地址<代码>ping通过这种方式,您正在查找特定的计算机,而不是分配该IP地址的任何设备。使用dynamics进行测试时,我计划运行的计算机将处于静态状态。我想使用IPs,以防在任何时候出现名称解析的问题。这是一个非常深思熟虑的回应,应该进行表决。我可能会稍微解释一下“功能”是如何工作的,但也许它足够直观?这是一个非常深思熟虑的回答,应该被提升。我可能会解释一下“函数”是如何工作的,但也许它足够直观?