我需要运行一个.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
不存在但同时保持在循环的同一次迭代中。
答案 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