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

标签 windows batch-file port sequence portqry

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

portqry -n servername -e 80

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

  1. 开发人员 1 80
  2. 开发人员 2 80
  3. DEV3 80
  4. 测试 1 80
  5. 测试 2 80
  6. 生产 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
    )
)

如果您要测试的只是网络服务,那么以不同的方式进行测试可能更有意义。您可以使用 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/

相关文章:

php - 为 Cygwin 设置 PHP 变量路径

将 C 代码与 CUDA 链接时发生 CMake 错误

windows - Autorun.inf 文件不在 Windows 7 环境中启动 exe

windows - 从 Visual Studio 2013 命令提示符追加到 INCLUDE 环境变量

spring-boot - 如何在docker中公开$ {PORT} spring boot application随机端口?

windows - 从cmd解析数据

string - 用于测试脚本是否包含字母和数字以外的任何内容的批处理代码

image-processing - Imagemagick 'convert' : how to simply create thumbnails for a folder of images and retain their filename?

ruby-on-rails - 在 3000 端口主机提供的 IP 上绑定(bind) rails app

java - 检查 Selenium Hub/Node 是否在给定端口上运行