1

助けてくれてありがとう。

テキスト ファイルから IP アドレスのリストを単純に ping するバッチ ファイルを作成しようとしています。

次のコードを使用して実行できることはわかっています。

FOR /F %i in (yourFile.txt) DO yourcommand %i

フォーマットを使用して以下を作成しました。

::@echo off
pause
for /F %%a in (vlans.txt) do (

pause
ECHO Checking connection to subnet %%a, please wait....
PING -n 1 %%a|find "Reply from " >NUL
IF NOT ERRORLEVEL 1 goto :SUCCESS
IF ERRORLEVEL 1 goto :FAIL

:FAIL
ECHO Subnet %%a is unreachable
pause

:SUCCESS
ECHO Subnet %%a has passed!
pause

)

ECHO All subnets have now been tested....................
Pause

少し整理する必要があります。何が起こっているのかを確認できるように、@Echo off をコメントアウトしました。以下が出力されます。

C:\for /F "tokens=*" %a in (vlans.txt) do (

pause
ECHO Checking connection to subnet %a, please wait....
PING -n 1 %a  | find "Reply from "  1>NUL
IF NOT ERRORLEVEL 1 goto :SUCCESS
IF ERRORLEVEL 1 goto :FAIL

ECHO Subnet %a is unreachable
pause

ECHO Subnet %a has passed!
pause
)

C:\>(

pause
ECHO Checking connection to subnet 10.169.169.129, please wait....
PING -n 1 10.169.169.129  | find "Reply from "  1>NUL
IF NOT ERRORLEVEL 1 goto :SUCCESS
IF ERRORLEVEL 1 goto :FAIL

ECHO Subnet 10.169.169.129 is unreachable
pause

ECHO Subnet 10.169.169.129 has passed!
pause
)

Press any key to continue . . .

Checking connection to subnet 10.169.169.129, please wait....

C:\>ECHO Subnet %a has passed!

Subnet %a has passed!

C:\>pause

Press any key to continue . . .

そのため、テキスト ファイル内のすべての IP アドレスを循環しないなど、理解できない、または予期していなかった多くのことが起こっています。最初は変数を入力せずに、次に変数を入力して繰り返します。また、バッチ ファイルが実行されると、一部の変数に IP アドレスが入力されません。

バッチ ファイルを作成するのは初めてなので、構文が間違っていることはわかっていますが、どこが間違っているのかわかりません。

vlan.txt には、IP アドレスのリストが 1 行に 1 つずつあります。

前もって感謝します。

4

3 に答える 3

1

コードに大きな問題があります。

GOTOループ内(またはコードの任意のブロック内)では、ループ/ブロックが中断されます。
したがって、最初GOTO :somewhereのループの後、ループはすぐに終了します。
また、ブロック内のラベルは奇妙なエラーを引き起こす可能性があるため、これも回避する必要があります。

これらの2つのラインは最適化できます

IF NOT ERRORLEVEL 1 goto :SUCCESS
IF ERRORLEVEL 1 goto :FAIL

IF ERRORLEVEL 1 ( echo FAIL ) ELSE (echo Success)

もう1つの問題は、IF ERRORLEVEL 1構文自体です。
ERRORLEVELが数値以上の場合はtrueです。
したがって、私はより明白な構文を好みます

IF !ERRORLEVEL! EQU 0 echo SUCCESS

ブロックでは、ブロックが実行されたときではなく解析されたときにパーセント展開が行われるため、パーセント展開でエラーレベルにアクセスすることはできません。

遅延拡張(感嘆符付き)の場合は、最初にを介して有効にする必要がありますsetlocal EnableDelayedExpansion

@echo off
setlocal EnableDelayedExpansion
for /F %%a in (vlans.txt) do (
    ECHO Checking connection to subnet %%a, please wait....
    PING -n 1 %%a >NUL
    IF !ERRORLEVEL! == 0 (
        ECHO Subnet %%a has passed^^!
    ) else (
        ECHO Subnet %%a is unreachable
    )
)
于 2013-03-18T22:39:13.443 に答える
1

これを試して:

@echo off
for /F %%a in (vlans.txt) do (
    ECHO Checking connection to subnet %%a, please wait....
    PING -n 1 %%a|find "Reply from " >NUL
    IF %ERRORLEVEL% neq 0 (ECHO Subnet %%a is unreachable) else ECHO Subnet %%a has passed!
)
ECHO All subnets have now been tested....................
Pause
于 2013-03-18T20:48:24.530 に答える
1

上記の例のほとんどは、さまざまな理由で失敗します。以下の例は、上記の例 = 1 を使用して
Win7 で問題なく動作します。ping を %Errorlevel% でチェックすることはできません 。. . IP-Protocol スタックが完全に接続されていない限り。 PING.EXE コマンドのエラーレベルは、PING.EXE が期待どおりに「実行」されたことのみを示してい ます。. . 応答や出力が何であったかについては何も示していません。 * * * * * * * * 2. "FIND" コマンドを介して PING コマンドをパイプするための優れたアイデア(. . . prev PING コマンドを txt ファイルにパイプし、 その TXT に対して "検索" していました。 -FILE.) ------- ただし、「返信元」の「検索」:












. . は次の理由で失敗します。

32 バイトのデータを使用して 192.168.1.100 に ping を実行します。
192.168.1.34 からの応答: 宛先ホストに到達できません。

この場合、192.168.1.34 (2 行目) は、ターゲットが「到達不能」であることを報告しているローカルホストです
----------------------------- --------------
注: 成功した ping 応答には常に TTL=(65 未満の数値) が含まれます。

32 バイトのデータで 192.168.1.1 に ping を実行:
192.168.1.1 からの返信: bytes=32 time

要点: 代わりに "TTL=" を使用して、ping 出力を FIND.EXE にパイプします*
* * * * * * * *


= = = = = 私の作業例:

@エコーオフ
setlocal EnableDelayedExpansion

for /F %%a in (cpuipaddrs.txt) do (
    エコー。
    ECHO PINGING %%a、お待ちください....
    PING -n 2 %%a|検索 "TTL=" >NUL
    IF !ERRORLEVEL! neq 0 (ECHO 到達不能、%%a は到達不能
       ) ELSE (ECHO %%a は ping に成功しました )
)



= = = = = 上からの画面出力:

PINGING 192.168.1.1、お待ちください....
 192.168.1.1 は ping に成功しました

PINGING 192.168.1.100、お待ちください....
      到達不能、192.168.1.100 は到達不能

PINGING 192.168.1.111、お待ちください....
 192.168.1.111 は ping に成功しました

この BATFILE に関する追加の注意:
1.「FOR ループ」内で、%ERRORLEVEL% を !ERRORLEVEL! として参照していることに注意してください。
「EnableDelayedExpansion」を読んで、これらのループ内で通常の %Percent-Variables が正常に機能しない理由を理解してください。

2. また、「open」と「close」の括弧をどのように分割したかについても特に注意してください。特に、3
行目の「DO」の後と、8 行目の「ELSE」の前です。
、'parens'、DO's、ELSE's など

3. この例では、cpuipaddrs.txt は 3 行の通常の txt ファイルです。

192.168.1.1
192.168.1.100
192.168.1.111
于 2014-12-30T04:08:09.367 に答える