Простая логика в .bat файле? - PullRequest
2 голосов
/ 26 января 2012

Мне нужно запустить файл .bat для запуска команды SQL по требованию. Он должен иметь if, вложенный в for, и if должен повторяться до истины.

То, что у меня есть:

@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 ]

2 голосов
/ 26 января 2012

Вы никогда не должны ПОЛУЧИТЬ метку: в заключенном в скобки блоке кода.См. https://stackoverflow.com/a/8481978/1012053 - он имеет дело с блоком IF (), но концепция для блока FOR..DO () одинакова.Выполнение GOTO в рамках FOR..DO () прервет оставшуюся часть итераций FOR ПРИМЕЧАНИЕ. - Цикл FOR / L автоматически завершит подсчет без фактической обработки предложения 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 голосов
/ 26 января 2012

Я бы попробовал:

@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
...