2017-03-09 159 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」