批量检查主机名是否有效

Check if a hostname is valid or not in batch

我想用一个简单的批处理脚本检查计算机是否可 ping 通。 在某些情况下,我输入错误并且主机名不正确,但作为反馈“成功”。

@echo off
REM stor.bat:
ping -n 1 %1 | find "TTL=" >nul
if errorlevel 1 (
        echo Reachable
        explorer.exe \%1\c$\   
    
) else (
        echo Not reachable
)

您的命令基于查找“TTL=”,它适用于 ip4 号码,所以这应该有效

@echo off
REM stor.bat:
ping -n 1 %1 | find "TTL="
if %errorlevel%==0 (echo Reachable & explorer.exe \%1\c$\) else (echo Not reachable & pause)

所以

stor 127.0.0.1
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reachable

但 ping 对名称并不理想,请参阅此未显示成功的响应

stor advent
Not reachable

但是 ping -n 1 advent returns 没有提示“TTL”

Pinging ADVENT [fe80::6467:ace9:6aef:cb1a%10] with 32 bytes of data:
Reply from fe80::6467:ace9:6aef:cb1a%10: time=1ms

Ping statistics for fe80::6467:ace9:6aef:cb1a%10:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 1ms, Maximum = 1ms, Average = 1ms

一种方法是“查找”响应,例如“往返”

@echo off
REM stor.bat:
ping -n 1 %1 | find "round trip"
if %errorlevel%==0 (echo Reachable & explorer.exe \%1\c$\) else (echo Not reachable & pause)

[编辑] 正如@Stephen 提醒的那样,我们可以通过添加 -4 来使用您的第一种方法来强制 TTL=

@echo off
REM stor.bat:
ping -4 -n 1 %1 | find "TTL="
if %errorlevel%==0 (echo Reachable & explorer.exe \%1\c$\) else (echo Not reachable & pause)

batch-file 将 ping 主机以确定它是否可用。这使用 PowerShell 核心。如果您只使用 Windows PowerShell,请将 pwsh.exe 更改为 powershell.exe

请记住,某些主机可能禁用了 ICMP (ping)。

此外,如果您输入错误的在线主机名(host02 而不是 host01),它也将 return 视为成功。

SET "THEHOST=%1"
FOR /F "delims=" %%A IN ('pwsh.exe -NoLogo -NoProfile -Command ^
    "if (Test-Connection -TargetName %THEHOST% -Count 1 -Quiet) { 1 } else { 0 }"') DO (
    SET /A "ISCONNECTED=%%A"
)
IF %ISCONNECTED% EQU 1 (
    ECHO The %THEHOST% is connected
) ELSE (
    ECHO The %THEHOST% is NOT connected
)