2012-01-26 3 views
2

У меня есть необходимость запуска файла .bat для запуска команды SQL по требованию, она должна иметь if, вложенную в for, и if следует повторять до значения true.Простая логика в .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

This бомбы, когда он попадает в петлю, если я перееду: цикл от того, где она находится в пределах, если заявление он работает нормально, однако это не так много использования.

Мне нужно, чтобы это продолжалось до тех пор, пока reset.sql не существует, но в то же время оставайтесь в пределах одной и той же петли цикла.

ответ

2

Вы не должны когда-либо GOTO: с этикеткой в ​​скобки блока кода. См. https://stackoverflow.com/a/8481978/1012053 - он работает с блоком IF(), но концепция для блока FOR..DO() одинакова. Выполнение GOTO в FOR..DO() прервет оставшуюся часть для итераций Примечания -/L цикл FOR будет молча закончить подсчет фактически не обрабатывает DO() пункт

Эта модификация должна дать вам поведение, которое вы ищете.

@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