2017-08-02 18 views
0

複数のSQLスクリプトを実行し、その出力を1つのテキストファイル(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 

これは、ことは注目に値します出力には動的な行数があり、可変文字制限を超え、「Msg ...」行が必ずしも最初ではないことがあります。

私は変数にチェックを行うためのテストのためにこれを試してみましたが、それだけで、各ラインの出力の最後の行を書き込みます:

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

はこのようなものは、その結果を解析することによって行うことができます"Msg"で始まる行を見つけようとする行ごとに、&を作成する代わりに変数内でスクリプトごとにテキストファイルを削除しますか?

+1

は、あなたが知っている最後のアレイと出力の

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

ストアMSGライン、私はsqlcmd'は上のゼロを終了します '賭けます成功、エラーなしで非ゼロ。必ず文書を確認してください。しかしそれが本当であれば、 'sqlcmd command_to_run_a_script ||エコーエラーが発生しました。終了コードが信頼できない場合は、 'sqlcmd command_to_run_a_script | findstr/i "^ Msg"> NUL && echo出力にエラーがありました。何かが間違っていました。 ' – rojo

+0

-bスイッチが使用されていると、SQLCMDは本当にエラーで終了するので、これを指摘していただきありがとうございます。 – VladP

答えて

1

変数には1行しか格納されないため、あなたの意図するところはわかりません。

をファイルにエラーのある行だけをフィルタリングするには:

@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

関連する問題