2017-08-02 60 views
0

我有一批用於運行多個SQL腳本並將其輸出記錄在單個文本文件(SQL_results.txt)中。這是將在輸出的開始運行一個腳本,並檢查錯誤的結果塊(錯誤都是在同一行,從「消息」):批處理 - 解析多行命令輸出變量

SQLCMD command_to_run_a_script > error.txt 
set /p result=<error.txt 
set result=%result:~0,3% 
if ""%result%""==""Msg"" exit 
type error.txt >> SQL_results.txt 
del error.txt 

值得注意的是輸出具有動態數量的行並且可能超過變量char限制,並且「Msg ...」行可能並不總是第一行。

這個我試過做一個變量中的檢查測試,但它只會寫輸出每一行的最後一行:

for /f "delims=" %%i in ('SQLCMD command_to_run_a_script') do (set VAR=%%i & ECHO %VAR%>> SQL_results.txt) 

能像這樣被解析的結果進行逐行試圖找到一個以「Msg」開頭的變量,而不是必須創建&爲每個腳本刪除一個文本文件?

+1

你知道數組和輸出,我敢打賭'sqlcmd'將在退出零成功,帶有錯誤的非零。檢查文檔以確保。但如果這是真的,你可以'sqlcmd command_to_run_a_script ||回聲有一個錯誤。「或類似的。如果退出代碼不可靠,您還可以'sqlcmd command_to_run_a_script | findstr/i「^ Msg」> NUL && echo輸出包含錯誤。出錯了.' – rojo

+0

謝謝你指出,如果使用-b開關,SQLCMD確實會出錯,所以我可以使用它。 – VladP

回答

1

由於一個變量只能保存一行,所以我不清楚你打算如何。

僅過濾行有錯誤到一個文件:

SQLCMD command_to_run_a_script|Findstr "^MSG" > error.txt 

商店味精線在年底

@Echo off&Setlocal EnableDelayedExpansion 
Set cnt=0 
For /f "delims=" %%A in (
    'SQLCMD command_to_run_a_script ^|Findstr "^MSG" ' 
) Do (
    Set /A cnt+=1 
    Set "MSG[!Cnt!]=%%A" 
) 
Echo had %cnt% MSG lines 
For /l %%C in (1,1,%cnt%) Do Set MSG[%%C] 
+0

這個想法是記錄SQL_results.txt文件中所有腳本的所有結果。發生錯誤時,也應該記錄下來,但是批處理應該停止運行。 rojo的評論改變了我運行腳本的方式,並讓我達到了預期的結果,但感謝你的幫助 – VladP

相關問題