2009-04-08 9 views
4

ファイルをインストールディレクトリにコピーするためのVisual Studioカスタムビルドステップで実行されているバッチファイルがあります。私は、コピーが失敗したときに適切にエラーを出したい。私が持っているオプションに問題があります:Visual Studio(2008 SP1)プロジェクトで.batからエラーを返すにはどうすればいいですか?

  • exit 1
    これは罰金が、時々私は、コマンドラインからバッチファイルを使用するか、別のバッチ内から、これらの場合には、ビルド・シーケンス内で動作しますexitは発信者も終了させます。

  • exit /b 1
    これは、コマンドラインまたは別のバッチファイルからうまく動作しますが、Visual Studioがリターンコードが0でなかったことを認識していない(すなわち、それは「0エラー(S)」を持つプロジェクトを報告します) 。

私は解決策を私に提供するリンクに出くわした:http://www.nabble.com/Re:-bjam-and-Windows-p17457249.html

基本的にそれは私がexit /bを行う前に、エラーメッセージをエコーし​​なければならないと言います。たとえば、

echo MyProj : error : could not copy files. 

Visual Studioがエラーを認識するためにどのようなメッセージフォーマットが発生するのか正確に知っている人はいますか?

私はこれを微調整しようとしましたが、いくつかの作業といくつかの試みは試していません。一致する必要があると思われる

.*\: .*error.*\: 

これはどこに文書化されていますか?

ありがとうございました。

これは、Windows XP Pro SP3のVisual Studio 2008 SP1(cmd.exeのWindowsバージョンの動作が異なる場合)です。

+0

@オウェン、私は答えは分かりませんが、使用しているVSのバージョンを指定すると役立ちます。答えは、VSの正確なバージョンによって異なる場合があります。 –

+0

良い点。それはVSです2008. – Owen

答えて

2

(VS読み取りものです)プロセスから返される値は、あるさ
This pageは、ビルドツールの出力としてVSが期待する完全な構文を指定します。

+0

パーフェクト。ありがとうございました! – Owen

1

これは正しくテストしていますか? は、私はちょうどこのバッチファイルしようとしました:ビルド前の段階として、VS2008と

echo bla 
exit /b 1 

をして得た本:私ものカスタムビルドステップでこれを試してみた

1>------ Build started: Project: XXXX, Configuration: Debug Win32 ------ 
1>Performing Pre-Build Event... 
1>bla 
1>Project : error PRJ0002 : Error result 1 returned from 'C:\Windows\system32\cmd.exe'. 
1>Build log was saved at "file://c:\XXXXX\BuildLog.htm" 
1>XXXXX - 1 error(s), 0 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

同じ正確な結果を持つファイル。
注意しなければならないのは、VS2008- SP1です。

+0

面白いです。これは現在、ファイルのカスタムビルドステップです。私はビルドイベントとして試して、同じ結果を得ました。私はあなたが持っているものと正確になるようにスクリプトを変更しようと試みました。 しかし、はい、私はそれが私のマシンで同じ動作しないことは確信しています。 "エコー"行を変更するだけで結果が変わります。 – Owen

1

通常、バッチファイルの戻り値は、バッチファイル内で最後に実行されたコマンドの戻り値です。

出口でなければなりませんが、何らかの理由でいつでも戻り値を設定するためにヘルパープログラムを使用できます。

DOS時代には、ECHOをCHOICEコマンドと組み合わせて使用​​して戻り値を設定することができましたが、それはもはやウィンドウの一部ではありません。

代わりに小さなプログラムを書くことができます。その後、戻り値としてことを設定し、返し、引数として所望の戻り値を取る何か:

#include <cstdio> 

int main(int argc, char * argv[]) { 

    if (argc == 2) { 

     return strtoul(argv[1], NULL, 10); 

    } else { 
     return 0; 
    } 
} 

は、その後、あなたのバッチファイルで、あなただけの希望戻り値を使用してプログラムを呼び出し、最後にジャンプ。あなたが試すことができます

+0

興味深い!それは確かに動作します。私は本当に "exit/b"の問題が... – Owen

2

もう一つはこれです:

set errorlevel=1 
exit /b 

これは基本的に@Billを示唆するものと同じ効果があります。最後のプログラムのRANの戻り値は%errorlevel%という環境変数に設定されていて、cmd.exeのに終了したときに、これはあなたの実際の質問について

+0

"exit/b 1"と同じようにこれと同じように扱います:うまくいきません。しかし、 "set errorlevel = 1"を実行してから "exit"を実行すると動作します。 – Owen

+0

"exit"を省略すると動作しません。私が "set errorlevel = 1"を.batの最後の行にすれば – Owen

0

exit /b 12は、何らかの理由でポストビルドステップに書き込まれたときに終了コードを設定しません。通常のexit 12が有効です。

だから、正しくbatファイルからの終了コードを返すために、あなたはこれを書く必要があります。

​​

callコマンドが重要であるBATファイル実行している、それはbatファイルがそうするとき、あなたの中で実行されている新しいコンテキストを作成するときbatファイルにexit /b 1を実行すると、コマンドインタプリタ全体ではなく、そのコンテキストが終了します。次に、errorlevelを比較して終了することができます。

関連する問題