.bat文件中的简单逻辑?

时间:2012-01-26 11:30:39

标签: loops batch-file nested goto

我需要运行一个.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 个答案:

答案 0 :(得分:2)

您不应该在带括号的代码块中使用GOTO a:标签。请参阅https://stackoverflow.com/a/8481978/1012053 - 它处理IF()块,但FOR..DO()块的概念是相同的。在FOR..DO()中执行GOTO将中止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

答案 1 :(得分: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