2017-10-23 25 views
0

アマチュアスクリプトコーダーここで、私のループスクリプトを目的の方法で動作させるための助けを求めています。ループ内で変数を更新する

私はpingする9つのIPアドレスのリストを持っています。これは、以下に示すように、2文字と1桁の変数で保存されます。

私が直面している2つの問題があると私はとにかく見ることができると思います。 最初に、変数に格納されているIPを呼び出そうとすると、実際に呼び出す変数内のIPではなく、必要な変数の名前をpingしようとします。

私が知っている2番目の問題は、変数の数字を増やす方法です。 IEは "AP1"を "AP2"に増やす方法などです。

ヘルプ! :(以下

は、私の状況を示すために、私のスクリプトのカットダウン版で完全なスクリプトでは多くの多くの異なる「サイト」

echo off 
setlocal enabledelayedexpansion 
cls 

:SET_SITE_ID 
echo There are 3 customers set up: [1] [2] [3] 
set /p SITE="Enter Site ID: " 
goto %SITE% 

:VERIFY_SITE_ID 
cls 
echo     Site ID set to: %SITE% 
echo      Location: %LOCATION% 
echo   The number of AP's is: %AP_QUANTITY% 
echo   The controller IP is: %CONTROLLER% 
echo       AP1 IP: %AP1% 
if defined AP2 echo       AP2 IP: %AP2% 
if defined AP3 echo       AP3 IP: %AP3% 
if defined AP4 echo       AP4 IP: %AP4% 
if defined AP5 echo       AP5 IP: %AP5% 
if defined AP6 echo       AP6 IP: %AP6% 
if defined AP7 echo       AP7 IP: %AP7% 
if defined AP8 echo       AP8 IP: %AP8% 
if defined SITE_NOTES echo Site Notes: %SITE_NOTES% 
choice /C 12 /N /M "Is the above info correct? [1=Proceed to Ping Test] [2=Change it]" 
if %errorlevel%==1 goto PING_TEST 
if %errorlevel%==2 goto SET_SITE_ID 

:PING_TEST 
cls 
choice /C 12 /N /M "Which test script? [1=Original] [2=Stephan's script]" 
if %errorlevel%==1 goto PING_TEST_ORIGINAL 
if %errorlevel%==2 goto PING_TEST_STEPHAN 

:PING_TEST_ORIGINAL 
cls 
echo Starting ping test. 
echo ------------------------------------------------------------------------------- 
echo Testing Controller... 
ping -n 2 %CONTROLLER% 
echo ------------------------------------------------------------------------------- 
echo Testing AP1 (of %AP_QUANTITY%)... 
ping -n 2 %AP1% 
if not defined AP2 goto END_OF_PING_TEST 
echo ------------------------------------------------------------------------------- 
echo Testing AP2 (of %AP_QUANTITY%)... 
ping -n 2 %AP2% 
if not defined AP3 goto END_OF_PING_TEST 
echo ------------------------------------------------------------------------------- 
echo Testing AP3 (of %AP_QUANTITY%)... 
ping -n 2 %AP3% 
if not defined AP4 goto END_OF_PING_TEST 
echo ------------------------------------------------------------------------------- 
echo Testing AP4 (of %AP_QUANTITY%)... 
ping -n 2 %AP4% 
if not defined AP5 goto END_OF_PING_TEST 
echo ------------------------------------------------------------------------------- 
echo Testing AP5 (of %AP_QUANTITY%)... 
ping -n 2 %AP5% 
if not defined AP6 goto END_OF_PING_TEST 
echo ------------------------------------------------------------------------------- 
echo Testing AP6 (of %AP_QUANTITY%)... 
ping -n 2 %AP6% 
if not defined AP7 goto END_OF_PING_TEST 
echo ------------------------------------------------------------------------------- 
echo Testing AP7 (of %AP_QUANTITY%)... 
ping -n 2 %AP7% 
if not defined AP8 goto END_OF_PING_TEST 
echo ------------------------------------------------------------------------------- 
echo Testing AP8 (of %AP_QUANTITY%)... 
ping -n 2 %AP8% 
if not defined AP9 goto END_OF_PING_TEST 
echo ------------------------------------------------------------------------------- 
echo Testing AP9 (of %AP_QUANTITY%)... 
ping -n 2 %AP9% 
goto END_OF_PING_TEST 

:PING_TEST_STEPHAN 
set count=0 
for /f "tokens=2 delims==" %%a in ('set AP') do (
set /a count+=1 
echo ------------------------------------------------------------------------------- 
echo testing %%a, [!count! of %AP_QUANTITY%] 
ping -n 2 %%a 
) 
goto END_OF_PING_TEST 

:END_OF_PING_TEST 
echo ------------------------------------------------------------------------------- 
choice /C YN /M "End of ping test. Repeat?" 
if %errorlevel%==1 goto PING_TEST 
if %errorlevel%==2 exit 

:1 
set LOCATION=Customer 1 
set AP_QUANTITY=1 
set CONTROLLER=192.168.0.253 
set AP1=192.168.0.252 
set SITE_NOTES=Notes go here 
goto VERIFY_SITE_ID 

:2 
set LOCATION=Customer 2 
set AP_QUANTITY=2 
set CONTROLLER=192.168.0.253 
set AP1=192.168.0.252 
set AP2=192.168.0.111 
set SITE_NOTES=Notes go here 
goto VERIFY_SITE_ID 

:3 
set LOCATION=Customer 3 
set AP_QUANTITY=9 
set CONTROLLER=192.168.0.253 
set AP1=192.168.0.252 
set AP2=192.168.0.111 
set AP3=192.168.0.8 
set AP4=127.0.0.1 
set AP5=127.0.0.1 
set AP6=127.0.0.1 
set AP7=127.0.0.1 
set AP8=127.0.0.1 
set AP9=127.0.0.1 
set SITE_NOTES=Notes go here 
goto VERIFY_SITE_ID 
+0

申し訳ありません、ああ。 Windowsのコマンドラインバッチファイル –

答えて

0

わずかな変更があります必要:使用して遅れた拡張と修正素敵な短いコードで、その結果、あなたの(for /fループを使用して)別の方法を示すために、if構文(それは代わりに===です)

@echo off 
setlocal enabledelayedexpansion 
set AP_QUANTITY=8 
set AP1=192.168.0.182 
set AP2=192.168.0.183 
set AP3=192.168.0.184 
set AP4=192.168.0.185 
set AP5=192.168.0.186 
set AP6=192.168.0.187 
set AP7=192.168.0.188 
set AP8=192.168.0.189 
set APS_YET_TO_PING=%AP_QUANTITY% 
set AP_TO_PING=AP1 

:PING_APS 
echo ---------------------------------------------------- 
echo Testing !%AP_TO_PING%! (of %AP_QUANTITY%) 
ECHO ping -n 2 !%AP_TO_PING%! 
echo ---------------------------------------------------- 
set /a AP_TO_PING=%AP%+1 
REM above line won't work like you want. 
set /a APS_YET_TO_PING=%APS_YET_TO_PING%-1 
REM another syntax: set /a APS_YET_TO_PING -=1 
echo AP's remaining to ping=%APS_YET_TO_PING% 
echo Next AP=%AP_TO_PING% 
pause 
if "%APS_YET_TO_PING%"=="0" goto END 
goto PING_APS 

:END 
ECHO Ping test complete 
pause 


set _apリスト_apで始まる名前を持つすべての変数(注意:appdataのような変数がある、ユニークな始まりを使用するので、私はアンダースコアで開始)。

@echo off 
setlocal enabledelayedexpansion 
set Quantity=8 
set count=0 
set _AP1=192.168.0.182 
set _AP2=192.168.0.183 
set _AP3=192.168.0.184 
set _AP4=192.168.0.185 
set _AP5=192.168.0.186 
set _AP6=192.168.0.187 
set _AP7=192.168.0.188 
set _AP8=192.168.0.189 
for /f "tokens=2 delims==" %%a in ('set _AP') do (
    set /a count+=1 
    echo testing %%a, [!count! of %Quantity%] 
    echo ping -n 2 %%a 
) 

(注:ECHOとの両方のスクリプトでのpingコマンドI「無効」高速なコードを動作させるとpingエラーを回避するだけで、トラブルシューティングの後ECHOを削除)

編集2

次のことを試してみてください。

... 
:PING_TEST_STEPHAN 
set count=0 
for /f "tokens=2 delims==" %%a in ('set AP') do (
set /a count+=1 
echo ---------------------------------------------------------------------- 
echo testing %%a, [!count! of %AP_QUANTITY%] 
ECHO ping -n 2 %%a 
) 
goto END_OF_PING_TEST 
... 

はを使用する私の理由を参照してください。上記のAP...の代わりに!
正常に動作しない場合は、echo onで試してみてください。またfor /?が役立ちます。

=(TOKEN1 = AP<n>、token2 =「」でそれを分割する際for /fこれは_AP<n>を使用するための私の理由です。(「トークン」と呼ばれる)第二部アウト"tokens=2 delims=="カット、set APの出力のすべての行を取ります、そうset _APはONLY IPのではなく、%APPDATA%AP_QUANTITYを示しています。あなたは、サイトの定義では、あまりにもそれを変更する必要があります。

があなたの1行を持つ:VERIFY_SITE_ID

for /f "delims=" %%a in ('set AP') do echo   %%a 
を簡素化することができます

の代わりにif defined ...行を使用してください。(注:set _APに変更し、上記の理由)
たり、出力に近い保つために:

for /f "tokens=1,2 delims==" %%a in ('set AP') do echo   %%a IP: %%b 
+0

ありがとう - 本当に助けて! :) –

+0

こんにちはステファン - これはありがとう。それはうまくいきますが、pingするAPが少なくなると、ループを早く終了する方法が必要になります。したがって私の元の思考のAPS_YET_TO_PING変数。トークンを3に増やすと、そのトークンを実装できますか?おそらく!カウント! %Quantity%に等しいか? –

+0

それは素晴らしいことです。それはあなたのためにあります。すべての '_AP 'を繰り返し処理します。知る必要はなく、どれくらいあるか。代わりに、たくさんの変数がなくても(1行に1つのIPだけ)ファイルを作成し、 '/ fのためにすべての行を繰り返しますdelims =" %% a in(ip​​-addresses.txt)do .. 」。変数を一切設定する必要はありません。私の2番目の例では、 'count'と' quantity'も必要ありません。ユーザーに進捗状況を示すだけです。 – Stephan

関連する問題