【问题标题】:Updating a variable within a loop在循环中更新变量
【发布时间】:2017-10-23 14:12:17
【问题描述】:

这里是业余脚本编码器,我正在寻求一些帮助,以使我的循环脚本以所需的方式工作。

所以我有 9 个要 ping 的 IP 地址列表,它们存储在设置为 2 个字母后跟 1 个数字的变量中,如下所示。

我认为我面临两个问题,无论如何我都可以看到。 第一个是当试图调用存储在变量中的 IP 时,它实际上试图 ping 我想要的变量的名称,而不是我想要调用的变量中的 IP。

我知道的第二个问题是如何增加变量的那个数字。 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

【问题讨论】:

  • 哦,对不起。 Windows 命令行批处理文件

标签: loops batch-file cmd command increment


【解决方案1】:

只需要小改动:使用延迟扩展并更正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

向您展示另一种方式(使用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“禁用”了两个脚本中的 ping 命令,以使代码运行更快并避免 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...而不是上面的AP...的理由!
如果您不确定它是如何工作的,请尝试使用echo onfor /? 也应该有所帮助。

for /fset AP 输出的每一行,"tokens=2 delims=="= 处拆分第二部分(称为'token')时将其截断(token1 = AP<n>, token2 = " "。这就是我使用_AP<n> 的原因,所以set _AP 只显示IP,而不是%APPDATA%AP_QUANTITY。您还必须在站点定义中更改它。

请注意,您可以使用单行简化 :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

【讨论】:

  • 谢谢 - 真的很有帮助! :)
  • 嗨斯蒂芬-谢谢。它运行良好,但是如果要 ping 的 AP 较少,则需要一种方法来提前结束循环;因此我最初想到的 APS_YET_TO_PING 变量。如果令牌要增加到 3,那么可以实现吗?也许如果当!count!等于 %Quantity% ?
  • 这是好事,for 为您做的。它遍历所有_AP<x>。不用知道,有多少。或者,您也可以拥有一个文件(而不是很多变量)(每行只有一个 IP)并遍历所有行 for /f "delims=" %%a in (ip-addresses.txt) do ...;根本不需要设置任何变量。在我的第二个示例中,甚至不需要countquantity。只是为了向用户显示进度。,
  • 嗨斯蒂芬 - 我不明白你的解决方案,对不起!你能重新措辞吗?将所有 IP 地址放在一个单独的文件中会使大多数人无法回复,因为根据位置有许多不同的 IP 需要 ping,并且每个位置都有自己的范围。我已经整理了我的脚本的精简版来帮助演示......
  • cmets 框不会接受脚本,所以我编辑了我的原始帖子以显示我提到的脚本
猜你喜欢
  • 2021-12-17
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多