gpt4 book ai didi

loops - 批处理 - "for/F loop"内部 "for/L loop"

转载 作者:行者123 更新时间:2023-12-03 03:20:41 33 4
gpt4 key购买 nike

我有以下问题:

我想创建一个批处理文件,循环访问一定数量的 IP 地址,以停止远程 PC 上的某个服务。

因为停止过程需要一些时间,所以我需要第二个循环来查询服务的状态并等待,直到服务达到“已停止”状态。

Set /p StartIP="Start IP (101): "
Set /p EndIP="End IP (199): "


for /L %%n IN (%StartIP%, 1, %EndeIP%) DO (

psservice -u username -p password \\192.168.8.&&n stop 'ServiceName'

:CHECK
echo 5 sek.
ping 127.0.0.1 -n 5 > nul

for /F "tokens=3 delims=: " %%H in ('psservice -u username -p password \\192.168.8.%%n query 'ServiceName' ^| findstr " STATE"') do (
if NOT %%H==STOPPED (
echo.
echo state: %%H
goto CHECK
)
echo.
echo state: %%H
)

psservice -u username -p password \\192.168.8.%%n start 'ServiceName'
)

现在我坚持的观点是:

第一次通过/F 循环后,/L 循环中的数字“%%n”范围被破坏。

举个例子,它看起来像这样:

Set /p StartIP="Start IP (101): 101"
Set /p EndIP="End IP (199): 105"


for /L %%n IN (101, 1, 105) DO (

psservice -u username -p password \\192.168.8.101 stop 'ServiceName'

:CHECK
echo 5 sek.
ping 127.0.0.1 -n 5 > nul

for /F "tokens=3 delims=: " %%H in ('psservice -u username -p password \\192.168.8.101 query 'ServiceName' ^| findstr " STATE"') do (
if NOT %%H==STOPPED (
echo.
echo state: %%H
goto CHECK
)
echo.
echo state: %%H
)

psservice -u username -p password \\192.168.8.%%n start 'ServiceName'
)

在此示例中,我的 IP 范围为 192.168.8.101 到 192.168.8.105。该批处理运行良好,直到第一次运行/F 循环。此后,/L 循环中的 %%n 参数消失了。服务无法再次启动,因为 %%n 参数已经丢失,我的/L 循环也无法继续 -.-

有人知道我可以做些什么来解决这个问题吗?

感谢您阅读这篇文章。

最佳答案

正如 MC ND 在他的评论中所说,在 FOR 循环中发出 GOTO 将打破循环。实际上,问题比这更普遍 - 在任何代码块(带括号或通过 & 连接)中发出 GOTO 将终止该 block 的其余部分。

简单的解决方案是提取需要 GOTO 的代码并将其放入自己的子例程中,然后从循环内调用该例程。

Set /p StartIP="Start IP (101):"
Set /p EndIP="End IP (199):"

for /L %%n IN (%StartIP%, 1, %EndIP%) DO (
psservice -u username -p password \\192.168.8.%%n stop 'ServiceName'
call :check %%n
psservice -u username -p password \\192.168.8.%%n start 'ServiceName'
)
exit /b

:CHECK
echo 5 sek.
ping 127.0.0.1 -n 5 > nul
for /F "tokens=3 delims=: " %%H in (
'psservice -u username -p password \\192.168.8.%1 query 'ServiceName' ^| findstr " STATE"'
) do (
echo.
echo state: %%H
if not %%H==STOPPED goto CHECK
)
exit /b

关于loops - 批处理 - "for/F loop"内部 "for/L loop",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39654245/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com