Windows批处理脚本,以查看是否打开了一系列服务器/端口?

haw*_*eye 3 windows port batch-file sequence portqry

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

portqry -n servername -e 80
Run Code Online (Sandbox Code Playgroud)

我想针对服务器列表运行它:

  1. DEV1 80
  2. DEV2 80
  3. DEV3 80
  4. TEST1 80
  5. TEST2 80
  6. PROD 80

我想使用单个Windows批处理脚本测试它们,并查看哪些端口打开以及哪些端口已关闭.(而且我不希望它在第一个封闭的端口上掉下来).

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

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

roj*_*ojo 7

干得好.向前付款.:)要直接回答您的问题,只需使用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%
Run Code Online (Sandbox Code Playgroud)

这是使用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
    )
)
Run Code Online (Sandbox Code Playgroud)

如果您正在测试的只是Web服务,那么以不同的方式进行此操作可能更有意义.您可以使用Microsoft.XMLHTTPCOM对象来消除该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);
Run Code Online (Sandbox Code Playgroud)