2017-10-23 3 views
0

아마추어 스크립트 코더 여기에 원하는 방식으로 작동하도록 루프 스크립트를 만드는 데 도움이 필요합니다.루프 내에서 변수 업데이트

그래서 아래에서 볼 수 있듯이, ping 할 9 개의 IP 주소 목록을 가지고 있습니다.이 주소는 변수 내에 2 개의 문자와 1 개의 숫자가 저장되어 있습니다.

내가 직면하는 두 가지 문제가 있다고 생각합니다. 어쨌든 볼 수 있습니다. 첫 번째는 변수 내에 저장된 IP를 호출 할 때 실제로 호출 할 변수 내의 IP가 아니라 원하는 변수의 이름을 ping하려고 시도한다는 것입니다.

제가 알고있는 두 번째 문제점은 변수의 해당 숫자를 증가시키는 방법입니다. 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

에만 작은 변화가 필요 :. 사용하여 지연 확장 및 수정 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 

당신에게 좋은 짧은 코드의 결과로 다른 방법 (A for /f 루프를 사용하여), 표시하려면
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와 두 스크립트에서 "장애인"핑 명령은 그냥 문제 해결 후 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 /? 도움이됩니다.

for /f

set AP의 출력의 모든 라인을 소요, 두 번째 부분 밖으로 "tokens=2 delims==" 인하에 그것을 분할 할 때 =이 (token1 = AP<n>, token2 = "가".이 _AP<n>를 사용하는 나의 이유입니다 ('토큰'라고도 함) 그래서 set _AP 만하지 %APPDATA%AP_QUANTITY을 IP의 보여 않습니다. 당신은 사이트 정의에 너무 변경해야합니다.

주 당신은 하나의 라인으로 :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 '를 반복합니다. 필요는 없습니다. 얼마나 많은 지 알 수 있습니다. 또는 (varables 대신) 하나의 IP (한 줄에 하나의 IP 만) 파일을 가지고'/ f "의 모든 행을 반복 할 수 있습니다. delims ="%% a in (ip-addresses.txt) do .. .'; 어떤 변수도 설정할 필요가 없습니다. 두 번째 예제에서는'count'와'quantity'가 필요하지 않습니다. 사용자에게 진행 상황을 보여 주기만하면됩니다., – Stephan

관련 문제