3

次の 1 つのコマンドを実行して、ポートが開いているかどうかを確認できます。

portqry -n servername -e 80

サーバーのリストに対してこれを実行したい:

  1. DEV1 80
  2. DEV2 80
  3. DEV3 80
  4. テスト1 80
  5. テスト2 80
  6. 製品 80

単一の Windows バッチ スクリプトを使用してそれらすべてをテストし、開いているポートと閉じているポートを確認したいと考えています。(そして、最初の閉じたポートで倒れたくありません)。

私の質問は次のとおりです。一連のサーバー/ポートが開いているかどうかを確認するための Windows バッチ スクリプトはありますか?

追加:ポートが開いているかどうかを確認する方法を尋ねる他の質問があることは承知しています。それらのどれも、信頼できる方法で一連のポートに対してスクリプトを作成することに関するものではありません。

4

3 に答える 3

8

どうぞ。あらかじめ支払う。:) 質問に直接答えるには、forループを使用してサーバーをループし、portqryそれぞれに対して a を実行します。 編集:あなたが見つけた 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 サービスだけである場合は、別の方法でこれを行う方が理にかなっている可能性があります。COM オブジェクトを使用して、その依存関係Microsoft.XMLHTTPを取り除くことができます。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);
于 2015-04-09T01:42:16.960 に答える
1

これは、上記の VBScript を次のものに置き換えることになったものですporttest.ps1powershell -f porttest.ps1

param(
    [string] $remoteHost = "arbitrary-remote-hostname",
    [int] $port = 23
     )

# Open the socket, and connect to the computer on the specified port
write-host "Connecting to $remoteHost on port $port"
$tcpobject = new-Object system.Net.Sockets.TcpClient 
$connect = $tcpobject.BeginConnect($remoteHost,$port,$null,$null) 
#Configure a timeout before quitting - time in milliseconds 
$wait = $connect.AsyncWaitHandle.WaitOne(1000,$false) 
If (-Not $Wait) {
    'Timeout'
    exit 1
} Else {
    $error.clear()
    $tcpobject.EndConnect($connect) | out-Null 
        If ($Error[0]) {
            Write-warning ("{0}" -f $error[0].Exception.Message)
            exit 1
        } Else {
            'Port open!'
            exit 0
        }
    }
于 2015-04-09T12:48:41.010 に答える