Loops 批次-“;for/F循环“;“内部”;for/L循环“;
我有以下问题: 我想创建一个批处理文件,通过一定数量的ip地址循环,以停止远程pc上的某项服务 因为停止过程需要一些时间,我需要第二个循环来查询服务的状态,并等待服务达到停止状态Loops 批次-“;for/F循环“;“内部”;for/L循环“;,loops,batch-file,Loops,Batch File,我有以下问题: 我想创建一个批处理文件,通过一定数量的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.&am
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参数已丢失,并且我的/L循环也无法继续--
有人知道我能做什么来解决这个问题吗
感谢您阅读本文。正如MC ND在评论中所说,在for循环中发出GOTO将打破循环。事实上,这个问题比这个问题更为普遍——在任何代码块中发出一个GOTO(paranthesized,或通过&)将终止该块的其余部分 简单的解决方案是提取需要转到的代码并将其放入自己的子例程中,然后从循环中调用该例程
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
据我所知,psservice不会执行异步调用来停止服务,并在没有响应的情况下退出。因此,您的第二个循环是完全不必要的?如果您在
中为
循环使用goto
命令,循环(所有嵌套级别)将中断感谢您的快速响应:-)没有第二个循环,psservice将在状态为STOP\u PENDING且未停止时尝试启动服务。这导致服务将永久停留在停止等待状态的问题。另一种方法是应用n
循环三次-首先将STOP
发送到每个地址,然后检查每个地址,然后启动
。这样做的好处是,在第一次遇到延迟时,您已经向每个进程发送了stop
,因此幸运的是,每个进程都在5秒钟的延迟内进入stopped
状态,并且它们都重新启动,从而将所需的延迟降至最低。@Magoo这是我第一次尝试批处理。在这种情况下,一切正常,但我必须停止和启动约50个服务,因为我有一个高ip范围。问题是服务的停机时间。如果我有坏的连接,批处理需要大约1小时的50个ip地址,这是一个很长的服务停机时间。谢谢你的回答。这听起来是个很好的主意,但现在我遇到了一个问题,参数%%n没有移交给提取的:checkroutine@Exasus然后将它添加到通话中call:check%%n
并与psservice…192.168.0.%1
@jeb一起使用它就像一个符咒:):)你们救了我一天和整个周末:):)谢谢大家这么多。喜欢这个community@Exasus-呃,我不假思索地使用了你的第二套代码,没有在支票中输入%%n。都修好了。