如果循环中有任何发动命令失败,如何从for循环退出

时间:2019-04-21 07:07:42

标签: batch-file

我正在将所有 sql dacpac 部署到所有数据库中,方法是将它们放在文本文件中并用于 loop ,如果任何数据库失败,我想停止部署成功部署。

我创建了一个如下所示的批处理脚本

"SQLCMD.EXE" -S DB -U user -P password -Q "SELECT name FROM master.dbo.sysdatabases Where [name] NOT IN ('master', 'tempdb', 'model', 'msdb')" -o alldb.txt

for /f "delims=" %%x in (alldb.txt) do (
    "SqlPackage.exe" /Action:Publish /SourceFile:"dacpac" /TargetDatabaseName:"%%x" /TargetServerName:"DB" /TargetUser:"user" /TargetPassword:"password"
    if %errorlevel% neq 0 exit /b %errorlevel% 
)

当我运行此批处理文件时,if命令与sqlpackage.exe命令一起执行,如下所示

"SqlPackage.exe" /Action:Publish /SourceFile:"dacpac" /TargetDatabaseName:"DB name" /TargetServerName:"DB" /TargetUser:"user" /TargetPassword:"password"

 if 0 neq 0 exit /b 0

因此,即使先前的数据库部署失败,部署也将在下一个数据库开始。

我需要一种方法,如果任何数据库部署失败,则不应在下一个数据库上开始部署,并且整个批处理脚本应停止并在for循环中提供错误级别。

1 个答案:

答案 0 :(得分:0)

以下语法对我有用。

for /f "delims=" %%x in (alldb.txt) do (
   "SqlPackage.exe" /Action:Publish /SourceFile:"dacpac" /TargetDatabaseName:"%%x" /TargetServerName:"DB" /TargetUser:"user" /TargetPassword:"password" || echo ERROR && exit /b
)