Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 批次-“;for/F循环“;“内部”;for/L循环“;_Loops_Batch File - Fatal编程技术网

Loops 批次-“;for/F循环“;“内部”;for/L循环“;

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

我有以下问题:

我想创建一个批处理文件,通过一定数量的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循环。 在此之后,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。都修好了。