0

我的代码如下:

CALL:ECHOCOLOR "Executing on server:[S059D526\TCH] db:CS filename:[9990294_UPDATE_Concessions.sql]." Cyan
SET CURRENT_SCRIPT="9990294_UPDATE_Concessions.sql"
if not exist "9990294_UPDATE_Concessions.sql" (
  CALL:ECHOCOLOR "skipping execution of file [9990294_UPDATE_Concessions.sql].  Possibly it was renamed because it has already ran" Yellow
)
if exist "9990294_UPDATE_Concessions.sql" (
  CALL:ECHOCOLOR "executing script [9990294_UPDATE_Concessions.sql]" Cyan
  sqlcmd -V 1 -r1 -E -S S059D526\TCH -d "CS" -i "9990294_UPDATE_Concessions.sql" -o "9990294_UPDATE_Concessions.sql.run_20120508_12_19_36.log"
)
CALL:ECHORESULT "result [OK=0,ERR=any other]: %errorlevel%" %errorlevel%
if NOT ERRORLEVEL 0 GOTO FINAL_ERROR
if exist "9990294_UPDATE_Concessions.sql" rename "9990294_UPDATE_Concessions.sql" "9990294_UPDATE_Concessions.sql.ok"

我面临的问题是errorlevel,因为在我运行数据库脚本后它总是返回 0。这是因为指令CALL:ECHORESULT "result [OK=0,ERR=any other]: %errorlevel%" %errorlevel%. 如果脚本运行时出错,它永远不会转到FINAL_ERROR. 当我遇到脚本错误时,我不知道如何进行验证以停止该过程。

4

1 回答 1

1

您的错误检查逻辑是错误的。

IF ERRORLEVEL N如果错误级别 >= N,则为真。所以IF NOT ERRORLEVEL 0永远不会是真的!(假设错误级别不是负数)。

你想要要么

if ERRORLEVEL 1 goto FINAL_ERROR

或者

if %ERRORLEVEL% neq 0 goto FINAL_ERROR

另一件事。您确实应该在您尝试测试的命令之后立即测试 ERRORLEVEL。我不知道:ECHORESULT例程是如何编码的,但它可能会改变当前的 ERRORLEVEL 值。

于 2012-05-31T02:53:17.220 回答