2012-01-26 10 views
2

私はオンデマンドでSQLコマンドを実行するために.batファイルを実行する必要があります。ifforにネストされ、ifは真になるまで繰り返す必要があります。.batファイルの単純なロジック?

私が持っているもの:

私が移動した場合には、ループを打つ
@echo off 
cd "%UserProfile%\Desktop\Scripting\" 

FOR /f "delims=" %%a in ('type queue.txt') DO (
:loop 

    IF EXIST reset.sql (

    goto loop 

) ELSE (

    ::Create SQL command 
    echo USE dbname> reset.sql 
    echo EXEC dbo.sp_ResetSubscription @ClientName = '%%a'>> reset.sql 
    echo EXEC dbo.sp_RunClientSnapshot @ClientName = '%%a'>> reset.sql 
    sqlcmd -i "reset.sql" 

    if exist reset.sql del /f /q reset.sql 
) 
) 
if exist queue.txt del /f /q queue.txt

この爆弾をアウト:しかし、それは多くの使用、それが正常に動作しますif文の中にあるところからのループではありません。

私が必要とするのは、reset.sqlが存在しないと同時にループの同じ繰り返し内にとどまるまでループし続けることです。

答えて

2

あなたが今までGOTOはいけません:コードの括弧で囲まれたブロック内のラベル。 https://stackoverflow.com/a/8481978/1012053を参照してください。これはIF()ブロックを扱いますが、その概念はFOR..DO()ブロックでも同じです。 FOR/Lループは静かに実際にこの修正DO()句

を処理せずにカウント終了しますあなたを与える必要があります - 反復が注)(FOR..DO内GOTOを実行することの残りを中止しますあなたが探している行動。

@echo off 
cd "%UserProfile%\Desktop\Scripting\" 

FOR /f "delims=" %%a in ('type queue.txt') DO (
    call :waitForNoReset 
    ::Create SQL command 
    echo USE dbname> reset.sql 
    echo EXEC dbo.sp_ResetSubscription @ClientName = '%%a'>> reset.sql 
    echo EXEC dbo.sp_RunClientSnapshot @ClientName = '%%a'>> reset.sql 
    sqlcmd -i "reset.sql" 
    if exist reset.sql del /f /q reset.sql 
) 
if exist queue.txt del /f /q queue.txt 
exit /b 

:waitForNoReset 
    if exist reset.sql goto :waitForNoReset 
exit /b 
0

私がしようとするだろう:

@echo off 
cd "%UserProfile%\Desktop\Scripting\" 

FOR /f "delims=" %%a in ('type queue.txt') DO (
:loop 

    IF NOT EXIST reset.sql (

    ::Create SQL command 
    echo USE dbname> reset.sql 
    echo EXEC dbo.sp_ResetSubscription @ClientName = '%%a'>> reset.sql 
    echo EXEC dbo.sp_RunClientSnapshot @ClientName = '%%a'>> reset.sql 
    sqlcmd -i "reset.sql" 

    if exist reset.sql del /f /q reset.sql 
    goto endIter 
    ) 

    goto loop 
    :endIter 
) 

if exist queue.txt del /f /q queue.txt 
+0

元の動作と同じ理由で動作しません。 [私の答え](http://stackoverflow.com/a/9018647/1012053)を参照してください。 – dbenham