3

このバッチスクリプトを機能させようとしていますが、いくつかのコマンドで少し問題があります。変数を有効と見なさず、代わりに無効なセクションに送信し続けます。奇妙なことに、コードの別の部分に同じ変数処理セクションがあります。これが私のコードです:

:comp
cls
ECHO.
ECHO =================================================
ECHO Please Select the Device you would like to ping:
ECHO =================================================
SET /P comp="> "
IF /I %comp%==1 goto reg
IF /I %comp%==2 goto reg2
IF /I %comp%==3 goto reg3
IF /I %comp%==4 goto reg4
IF /I %comp%==5 goto reg5
IF /I %comp%==6 goto reg6
IF /I %comp%==7 goto reg7
IF /I %comp%==8 goto reg8
IF /I %comp%==9 goto reg9
IF /I %comp%==0 goto reg0
IF NOT %comp%=='1''2''3''4''5''6''7''8''9''0' goto inval
goto _ping
:inval
cls
ECHO.
ECHO ======================================
ECHO Choice invalid, please try again.
ECHO ======================================
ECHO.
pause
goto comp
:reg
cls
ECHO.
ECHO =========================================================
ECHO Please select the specific you would like to connect to.
ECHO =========================================================
ECHO.
SET /P regi="> "
IF /I %regi%==1 set str3=141
IF /I %regi%==2 set str3=142
IF /I %regi%==3 set str3=143
IF /I %regi%==4 set str3=144
IF /I %regi%==5 set str3=145
IF /I %regi%==6 set str3=146
IF /I %regi%==7 set str3=147
IF /I %regi%==8 set str3=148
IF /I %regi%==9 set str3=149
IF NOT %regi%=='1''2''3''4''5''6''7''8''9''0' goto inval
goto _ping

したがって、最初のセクションが機能し、適切なセクションに送信されます。2番目のセクションは無効な応答セクションであり、3番目のセクションは正確なデバイス(および最後のオクテット)を処理してpingを実行するセクションです。有効な選択肢を入力した場合でも、そうでない場合は、無効なセクションに進みます。助言がありますか?

4

1 に答える 1

1

第1号

問題は次の行にあります。

IF NOT %regi%=='1''2''3''4''5''6''7''8''9''0' goto inval

regiは文字列と等しくないため'1''2''3''4''5''6''7''8''9''0'(有効な0〜9の入力が与えられた場合)、スクリプトは常にセクションにジャンプしinvalます。この行の背後にあるロジックには欠陥があることに注意してください。ユーザーがこれを入力として入力する可能性は低く、この動作が必要かどうかは疑問です。

regi代わりに、数字かどうかを確認したいだけだと思います。これに対する解決策は、単に初期値に初期化し、ステートメントstr3の後でそれをチェックすることです。if

str3=invalid
IF /I "%regi%"=="1" set str3=141
...
IF /I "%regi%"=="9" set str3=149
IF "%str3%"=="invalid" goto inval
goto _ping

str3「無効な」値を保持している場合、これは、どのステートメントも実行されていないため、入力が無効であることを意味しますif

第2号

同じことがこの行にも当てはまります。

IF NOT %comp%=='1''2''3''4''5''6''7''8''9''0' goto inval

compこれは非常にありそうもないことをチェックします

ステートメントのいずれかifが実行されると、スクリプトは「reg」ラベルの1つにジャンプします。入力が無効な場合、ifステートメントはスキップされるため、次のようにステートメントのgoto inval後に配置します。

IF /I "%comp%"=="1" goto reg
...
IF /I "%comp%"=="0" goto reg0
goto inval

これにより、次のgoto ping行も冗長になります。

第3号

スクリプトで別の問題を見つけることもできます。compが空の文字列の場合、次の比較(およびそのようなもの):

    IF /I %comp%==1 goto reg

この違法な表現を評価します:

IF /I ==1 goto reg

インタプリタにエラーが発生します。これを回避するために、比較の両側に固定文字を連結することをお勧めします。たとえば、次のようになります。

IF /I "%comp%"=="1" goto reg1


それが役に立てば幸い!

于 2012-12-16T15:10:30.433 に答える