2016-07-01 7 views
1

ファイル内の各行に対してプログラムを実行する必要があります。私は一度に4つのインスタンスを起動しています。 4つのインスタンスの後、しばらく待って別のインスタンスを起動します。待ち時間の後のバッチスクリプトが壊れています。gotoを使用するときにバッチファイル内のforループを中断する

私が間違っているとお考えください。

括弧 (...)のコードブロックのブロックコンテキストを破壊 goto :Label
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 
+1

意図的にブロックを離れたくない場合は、ブロック内に 'goto'やラベルを使用しないでください(ブロックは'( 'と') 'の間にあります)。 – Stephan

+1

ブロック全体を ':waittofinish'から始めることができます(' if "!JobName!" equ "" 'の' else'節のコード全体をサブルーチンに入れて 'call'を使います;そうすれば 'for/F %% J'ループの文脈から' goto'を隠すことになります... – aschipfl

+0

Thanks Aschipfl。出来た。あなたは私を救った...しかし何かが失われていますか?最後の行が2回実行されていますか?私はファイルの最後の行を意味する、プログラムは2回実行されて..これについての任意のアイデア?サブルーチンはプログラムを2回目にトリガしています。どのようにそれを防ぐために? – srinath

答えて

1

。これはfor ... do (...)ループとif ... (...) else (...)条件にも当てはまります。これを克服するために

これはgotoから呼び出し元のコード部分のブロック状況を隠しているため、あなたはこのように、サブルーチンにgoto:Labelとのコード部分を置くことができます。

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 

はNB:私はdidnのgrep.exeまたはdsexport.exeを持っていない/知りませんので、あなたのスクリプトのロジックをチェックしないでください。

関連する問題