批处理 - “for / L loop”中的“for / F loop”

时间:2016-09-23 06:44:18

标签: loops batch-file

我有以下问题:

我想创建一个循环遍历大量ip地址的批处理文件,以停止远程PC上的某项服务。

因为停止过程需要一些时间我需要有第二个循环来查询服务状态并等待服务达到状态STOPPED。

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循环。 在此之后,来自my / L循环的%% n参数消失了。该服务无法再次启动,导致%% n参数已经丢失且my / L循环也无法继续--.-

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

感谢您阅读本文。

1 个答案:

答案 0 :(得分:3)

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

简单的解决方案是提取需要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