8

exitコマンドを使用して終了コードを返すバッチ ファイルがあります。

このバッチ ファイルは、場合によっては、コマンドラインから対話的に呼び出すことも、Execタスクを使用して MSBuild プロジェクトの一部として実行することもできます。

  • バッチ ファイル内で使用するexit %errorlevel%と、これはうまく機能し、MSBuild にエラー コードが表示されますが、コマンド ウィンドウからバッチ ファイルを実行している対話型ユーザーは、この場合、cmd.exe の失礼な終了を取得します。
  • exit /b %errorlevel%インタラクティブなシナリオを使用すると、失礼な終了が得られませんが、これはcmd、タスクによって起動されたものも終了しないことを意味するExecため、MSBuild は戻り値を認識しません。

両方の問題の解決策として、exit /b次のようにビルド スクリプトからバッチ ファイルを使用して起動しようとしています。

<Exec Command="Batch.cmd params &amp; exit %errorlevel%" />

「非ターミナル」リターンを明示的に取得しexit /b、手動で呼び出して、ビルドタスクが表示できる場所のexit外にこの値を伝播するという考えです。cmd.exeExec

これは完璧な解決策のように思えますが、うまくいきません。Execまだ正しいエラー値が得られません。

4

3 に答える 3

13

これを処理する 1 つの方法は、MSBuild がコマンド プロンプトからではなく、MSBuild が呼び出していることを認識できるように、MSBuild にパラメーターをバッチ ファイルに渡すようにすることです。たとえば、以下に示すサンプル ファイル test.bat を作成しました。

ECHO OFF

IF (%1)==() goto Start
SET fromMSBuild=1

:Start

ECHO fromMSBuild:%fromMSBuild%


REM ***** Perform your actions here *****

set theExitCode=101
GOTO End



:End
IF %fromMSBuild%==1 exit %theExitCode%


REM **** Not from MSBuild ****

ECHO Exiting with exit code %theExitCode%
exit /b %theExitCode%

そして、次の MSBuild ファイル wrapper.proj を作成しました。

<Project DefaultTargets="Demo" ToolsVersion="3.5"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    <BatchFile>test.bat</BatchFile>
    <FromMSBuild>FromMSBuild</FromMSBuild>
  </PropertyGroup>

  <Target Name="Demo">

    <Message Text="Executing batch file $(BatchFile)" Importance="high"/>

    <PropertyGroup>
      <_Command>$(BatchFile) $(FromMSBuild)</_Command>
    </PropertyGroup>

    <Exec Command="$(_Command)">
      <Output PropertyName="CommandExitCode" TaskParameter="ExitCode"/>
    </Exec>

    <Message Text="CommandExitCode: $(CommandExitCode)"/>
    
  </Target>
</Project>

コマンド プロンプトからファイル test.bat を実行すると、結果は次のようになります。

C:\Data\Development\My Code\Community\MSBuild\BatchFile>test.bat

C:\Data\Development\My Code\Community\MSBuild\BatchFile>ECHO OFF
fromMSBuild:0
Exiting with exit code 101

MSBuild からの結果は次のとおりです。

C:\Data\Development\My Code\Community\MSBuild\BatchFile>msbuild Wrapper.proj /t:Demo /fl /nologo
Build started 5/18/2009 10:54:52 PM.
Project "C:\Data\Development\My Code\Community\MSBuild\BatchFile\Wrapper.proj" on node 0 (Demo target(s)).
  Executing batch file test.bat
  fromMSBuild:1
C:\Data\Development\My Code\Community\MSBuild\BatchFile\Wrapper.proj(17,5): error MSB3073: The command "test.bat FromMSBuild" exi
ted with code 101.
Done Building Project "C:\Data\Development\My Code\Community\MSBuild\BatchFile\Wrapper.proj" (Demo target(s)) -- FAILED.


Build FAILED.

"C:\Data\Development\My Code\Community\MSBuild\BatchFile\Wrapper.proj" (Demo target) (1) ->
(Demo target) ->
  C:\Data\Development\My Code\Community\MSBuild\BatchFile\Wrapper.proj(17,5): error MSB3073: The command "test.bat FromMSBuild" e
xited with code 101.

    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:00.06
于 2009-05-19T03:02:41.373 に答える
0

私はこれを試したことはありませんが、ERRORLEVEL という名前の環境変数を設定するとどうなるでしょうか? Exec コマンドの内容の後に隠されている MSBuild には、「exit %ERRORLEVEL%」があります。設定されている場合、%ERRORLEVEL% は実際のエラー レベルをオーバーライドします。

于 2009-09-12T09:31:58.197 に答える