我可以运行一个命令来查看端口是否打开:

portqry -n servername -e 80

我想针对服务器列表运行它:
  • DEV1 80
  • DEV2 80
  • DEV3 80
  • TEST1 80
  • TEST2 80
  • PROD 80

  • 我想使用一个 Windows 批处理脚本来测试它们,看看哪些端口是打开的,哪些是关闭的。 (而且我不希望它在第一个关闭的端口上摔倒)。

    我的问题是:是否有 Windows 批处理脚本来查看服务器/端口序列是否打开?

    附加: 我知道还有其他问题询问如何检查端口是否打开。它们都不是以可靠的方式为一系列端口编写脚本。

    最佳答案

    干得好。提前付款。 :) 要直接回答您的问题,只需使用 for 循环遍历您的服务器并在每个服务器上执行 portqry 编辑: 您发现的那个 PowerShell 片段对于摆脱 PortQry 依赖很有用。

    @echo off
    setlocal
    
    set "servers=dev1 dev2 dev3 test1 test2 test2:8080 prod prod:443"
    
    for %%I in (%servers%) do (
        for /f "tokens=1,2 delims=:" %%a in ("%%I") do (
            set "port=%%~b"
            if not defined port set "port=80"
            setlocal enabledelayedexpansion
            call :handshake "%%~a" "!port!" && (
                echo %%a port !port!: OK
            ) || (
                echo %%a port !port!: Error
            )
            endlocal
        )
    )
    
    goto :EOF
    
    :handshake <server> <port>
    powershell "$t=new-object Net.Sockets.TcpClient;$c=$t.BeginConnect('%~1',%~2,{},{});if($c.AsyncWaitHandle.WaitOne(1000)){$t.EndConnect($c);exit 0};exit 1"
    exit /b %ERRORLEVEL%
    

    这是使用 PortQry 2.0 的原始解决方案:

    @echo off
    setlocal
    
    set "servers=dev1 dev2 dev3 test1 test2 test2:8080 prod prod:443"
    
    for %%I in (%servers%) do (
        for /f "tokens=1,2 delims=:" %%a in ("%%I") do (
            set "port=%%~b"
            if not defined port set "port=80"
            setlocal enabledelayedexpansion
            portqry -n "%%~a" -e "!port!" >NUL 2>NUL && (
                echo %%a port !port!: OK
            ) || (
                echo %%a port !port!: Error
            )
            endlocal
        )
    )
    

    如果您正在测试的只是 Web 服务,那么以不同的方式进行测试可能更有意义。您可以使用 Microsoft.XMLHTTP COM 对象来摆脱 portqry 依赖;并且由此获得的响应将与 HTTP 服务更相关。 (例如,如果您有一个在端口 8080 上运行的 VNC 服务器,您希望 Web 服务正在监听,那么当您需要它返回失败时,portqry 可能会返回成功。)

    无论如何,将其保存为 .bat 脚本并加盐调味。

    @if (@CodeSection == @Batch) @then
    
    @echo off
    setlocal
    
    set "servers=dev1 dev2 dev3 test1 test2 test2:8080 prod prod:443"
    
    for %%I in (%servers%) do (
        for /f "tokens=1,2 delims=:" %%a in ("%%I") do (
            set "port=%%~b"
            if not defined port set "port=80"
            setlocal enabledelayedexpansion
            cscript /nologo /e:JScript "%~f0" "%%~a" "!port!" && (
                echo %%a port !port!: OK
            ) || (
                echo %%a port !port!: Error
            )
            endlocal
        )
    )
    
    goto :EOF
    
    @end // end batch / begin JScript chimera
    
    var server = WSH.Arguments(0),
        port = WSH.Arguments(1),
        protocol = port == 443 ? 'https' : 'http',
        URL = protocol + '://' + server + ':' + port + '/',
        XHR = WSH.CreateObject('Microsoft.XMLHTTP');
    
    XHR.open('GET', URL);
    XHR.setRequestHeader('User-Agent','XMLHTTP/1.0');
    XHR.send('');
    while (XHR.readyState != 4) WSH.Sleep(25);
    WSH.Quit(XHR.status - 200);
    

    关于用于查看服务器/端口序列是否打开的 Windows 批处理脚本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29526342/

    10-15 03:16
    查看更多