我需要为文件中的每一行运行一个程序。我一次触发四个实例。在四个实例之后,等待一段时间并触发另一个实例。等待时间后,批处理脚本正在崩溃。
如果我做错了,请建议。
for /F "tokens=*" %%J in ( %JobListFile% ) do (
SET JobName=%%J
echo job name !JobName!
if "!JobName!" equ "" (
echo joblist not found... rerun the script..
REM exit /b
) else (
:waittofinish
for /F "tokens=*" %%a in ( 'tasklist /fi "IMAGENAME eq dsexport.exe" ^| grep -c "dsexport.exe"' ) do ( SET /A CurrInstances=%%a )
echo current instance is !CurrInstances!
echo parallelism set to !NoOfParallelInstances!
if "!CurrInstances!" gtr "!NoOfParallelInstances!" (
echo going to wait
sleep 5
goto waittofinish
echo failed to go wait label...
) else (
echo Exporting job: !JobName! ...............Starting
start /b cmd /C "C:/IBM/9.1/InformationServer/Clients/Classic/dsexport.exe /D=%vDomain% /U=%vuserID% /P=%vpassword% /H=%vServer% %vDSProject% /NODEPENDENTS /JOB=!JobName! %tmppath%\!JobName!.dsx"
echo.
echo.
)
)
)
echo script completed...
exit /b
答案 0 :(得分:1)
goto :Label
打破括号( ... )
中代码块的块上下文;对于for ... do ( ... )
循环和if ... ( ... ) else ( ... )
条件也是如此。
为了解决这个问题,您可以将带有goto
和:Label
的代码部分放入子例程中,因为这会将来自goto
的调用代码部分的块上下文隐藏起来,如下所示:
for /F "usebackq tokens=*" %%J in ( "%JobListFile%" ) do (
SET "JobName=%%J"
echo job name !JobName!
if "!JobName!" equ "" (
echo joblist not found... rerun the script..
REM exit /b
) else (
rem /* The `goto` and `:Label` code fragment has been transferred to a subroutine,
rem which receives the current value of variable `JobName` as an argument: */
call :waittofinish "!JobName!"
)
)
echo script completed...
exit /b
:waittofinish JobName
rem // This subroutine contains the `goto` and `:Label` code fragment so that it does no longer appear inside of a block `( ... )`:
for /F "tokens=*" %%a in ( 'tasklist /fi "IMAGENAME eq dsexport.exe" ^| grep -c "dsexport.exe"' ) do ( SET /A CurrInstances=%%a )
echo current instance is !CurrInstances!
echo parallelism set to !NoOfParallelInstances!
if "!CurrInstances!" gtr "!NoOfParallelInstances!" (
echo going to wait
sleep 5
goto :waittofinish
echo failed to go wait label...
) else (
echo Exporting job: %~1 ...............Starting
rem // Not sure if some arguments should be enclosed in `""` in the next line (but I do not know `dsexport.exe`):
start "" /b cmd /C "C:/IBM/9.1/InformationServer/Clients/Classic/dsexport.exe /D=%vDomain% /U=%vuserID% /P=%vpassword% /H=%vServer% %vDSProject% /NODEPENDENTS /JOB=%~1 %tmppath%\%~1.dsx"
echo.
echo.
)
exit /b
<磷>氮。 B。:我没有检查脚本的逻辑,因为我没有/ grep.exe
或dsexport.exe
。