2017-03-09 3 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(出口)の場合'findstr 'によってMsg" %%〜na_sqloutput.txt> nul && exit || else(エコーが成功しました%%〜na_sqloutput.txt)エコーが正常に実行されました%%〜na_sqloutput.txt' – Aacini

答えて

0

FINDSTR will set %ERRORLEVEL% as follows

  • 0(FALSE)マッチが少なくとも1つのファイルの少なくとも1つのラインに見出されます。
  • 一致するファイルが見つからない場合(またはファイルがまったく見つからない場合)は1(真)です。
  • 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つの修正を手伝ってもらえますか。私のスクリプトフォルダには、1.abc.sqlのような番号付きのスクリプトがあります。2. ert.sql、3.tyh.sqlバッチスクリプトは、実行が開始され、提供されると、そのスクリプトからディレクトリ内のファイルの終わりまで、そしてスクリプト実行中に何らかのエラーがあった場合に開始する必要があります。実行は終了する必要があります –

+0

@NITESHHEGDEもちろん、私はあなたの問題のより詳細でより正確な説明を提供する、このような巨大なトピックの拡張について別の質問をする必要があります。もし私がそれを理解したら、['SET/P"接頭辞= sql開始番号 "'](https://ss64.com/nt/set.html)を入力し、 'for/F 'を構文解析してusebackq delims = %% G in( "%%〜a")もし%% G GEQ%接頭辞%なら...(参考:https://ss64.com/nt/)[ツアー] 2分を取ってください さらに[Help]を開き、少なくとも[ask]と[mcve]を読んでください。 – JosefZ

0

.... forに遭遇した場合、そのままでERRORLEVEL 1(出口...

%errorlevel%errorlevelの初期値である場合。

delayed expansionの使用についての無限のSOの記事を参照してください。

この構文は、「現在のerrorlevelが1以上であれば、それ以外は

関連する問題