ホストが起動しているか停止しているかを調べるバッチスクリプト

ホストが起動しているか停止しているかを調べるバッチスクリプト

IP 範囲 172.18.xx から 172.25.xx 内のネットワーク内の複数のシステムをスキャンし、各システムがアクティブかどうかを確認し、結果をファイルにダンプする必要があります。以下はスクリプトです。

@echo off
for /L %%x in (18,1,25) do (
    for /L %%y in (1,1,254) do (
        for /L %%z in (1,1,254) do (

    ping -n 1 172.%%x.%%y.%%z | find "Reply" > NUL
    IF NOT ERRORLEVEL 1 (set state=UP) ELSE (set state=DOWN)

    echo 172.%%x.%%y.%%z is %state% >> state.txt
)))

しかし、結果的には、一部の IP アドレスが未使用であっても、すべてのシステムが「稼働中」であると結論付けられます。

スクリプトに問題はありますか?

答え1

スクリプトの問題は、バッチ スクリプトの非常に奇妙な点にあります。環境変数を IF または FOR 内で更新するには、setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION と を 使用する必要があります!var!。興味があれば、その不合理さ (!var! を含む setlocal 行を含めない場合に何が起こるか) については でさらに説明されていますset /?

setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
for /L %%x in (18,1,25) do (
    for /L %%y in (1,1,254) do (
        for /L %%z in (1,1,254) do (

    ping -n 1 172.%%x.%%y.%%z | find "Reply" > NUL
    IF NOT ERRORLEVEL 1 (set state=UP) ELSE (set state=DOWN)

    echo 172.%%x.%%y.%%z is !state! >> state.txt
)))

表示されているものだけが欲しい場合は、これを試してください

setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
for /L %%x in (18,1,25) do (
    for /L %%y in (1,1,254) do (
        for /L %%z in (1,1,254) do (

    ping -n 1 -w 1000 172.%%x.%%y.%%z | find "Reply" > NUL
    IF NOT ERRORLEVEL 1 (
        set state=UP
        echo 172.%%x.%%y.%%z is !state! >> state.txt
    ) ELSE (
        set state=DOWN
    )
)))

答え2

私は提案しますスパイスワークス(あなたの質問を見てこれを提案しますhttps://networkengineering.stackexchange.com/questions/6993/tool-or-script-for-collecting-network-inventory)。必要なすべての詳細は、spiceworks インベントリ ツールで入手できます。これは Windows AD に最適ですが、どちらの方法でも実行できます。

答え3

いくつのシステムをチェックする必要があるのか​​分かりませんが、解決策を見つけましたここ.. このようにするのが簡単だと思うなら、この答えを受け入れてください...

For /f %%i in (testservers.txt) do ping -n 1 %%i >>state.txt

**testservers.txt にすべての IP を含める

答え4

私は次のようなツールを使います怒ったIPスキャナーこの作業を行うには、スクリプトを作成する必要があります。まったく同じことを実行できるツールが他にもたくさんあるため、スクリプトを作成するのは無意味に思えます。

関連情報