2017-03-09 162 views
1

我想开发一个批处理脚本,它将执行批处理文件所在文件夹中存在的每个.sql SQL脚本,并将日志记录到filename_sqloutput.txt文件中。 条件是:如果任何脚本提供任何错误消息,如列名称不正确或表名等。脚本执行应立即停止,并且不应执行其他脚本。在目录中执行SQL脚本的批处理脚本

我试着用下面的代码:但它不工作,即使脚本在输出文件中给出错误。脚本执行不停止。

需要你的帮助!

@echo off 
for /f %%a IN ('dir /b *.sql') do (call sqlcmd -S AMRVSP000000318 -i %%a -o"%%~na_sqloutput.txt" 

findstr "Msg" %%~na_sqloutput.txt >nul & if %errorlevel% EQU 1 (exit) else (echo Successfully executed %%~na_sqloutput.txt) 
) 
pause 
+0

更改'FINDSTR “消息” %%〜na_sqloutput.txt> NUL&如果%ERRORLEVEL%EQU 1(出口) else(echo已成功执行%%〜na_sqloutput.txt)'by'findstr“Msg”%%〜na_sqloutput.txt> nul && exit || echo成功执行%%〜na_sqloutput.txt' – Aacini

回答

0

FINDSTR will set %ERRORLEVEL% as follows

  • 0(FALSE)的匹配是在至少一个文件中的至少一个线中。
  • 1(True)如果在任何文件的任何行中找不到匹配项(或者根本找不到该文件)。
  • 2语法错误

无效开关将仅打印错误流的错误消息。

此外,遵循EnableDelayedExpansion文章和重写该脚本以更可读的结构:

@echo off 
SETLOCAL EnableExtensions EnableDelayedExpansion 
for /f %%a IN ('dir /b *.sql') do (
    call sqlcmd -S AMRVSP000000318 -i %%a -o"%%~na_sqloutput.txt" 

    findstr "Msg" "%%~na_sqloutput.txt" 2>NUL 
    if !errorlevel! EQU 0 (
     echo error occured %%~na_sqloutput.txt 
     rem pause to see error 
     pause 
     exit /B 
    ) else (
     echo Successfully executed %%~na_sqloutput.txt 
    ) 
) 
pause 
+0

非常感谢JosefZ !!!你用这个查询解决了我的问题。非常感谢。 –

+0

你好JosefZ,你可以帮我一个更多的修改..我的脚本文件夹将有像1.abc.sql 2. ert.sql,3.tyh.sql编号的脚本批处理脚本应询问SQL文件名从哪执行应该开始,一旦提供,它应该从该脚本开始,直到目录中文件的结尾,以及脚本执行中是否有任何错误。执行应该结束 –

+0

@NITESHHEGDE当然,我可以为这种巨大的主题扩展提出另一个问题,提供更详细和更准确的问题描述。如果我理解它,通过['SET/P“前缀=输入sql起始号”'](https://ss64.com/nt/set.html)“并解析”for/F“usebackq delims =”。 %% G in(“%%〜a”)do if %% G GEQ%prefix%(...'。参考:https://ss64.com/nt/。请花2分钟[游览] 此外,打开[帮助]并至少阅读[问]和[mcve]。 – JosefZ

0

....如果错误级别1(出口,

%errorlevel%errorlevel初始值,因为它代表遇到for时。

见无尽的关于使用delayed expansion SO文章作为另一种解决方案

此语法的意思是“如果当前errorlevel是1或更大其他dothat”