Visual Studio:複数のビルド後コマンド?


101

Visual Studio 2008では、コマンドを宣言して、プロジェクトのビルド後のイベントにアタッチできます。多くの開発者と同様に、私は定期的にファイルをアプリケーション出力ディレクトリにxcopyするために使用しています。

1つのプロジェクト内で、2つの異なる場所から2つの異なる宛先にファイルをコピーする必要があるプロジェクトに取り組んでいます。つまり、同じビルド後のイベントから2つの異なるxcopyコマンドを呼び出す必要があります。ビルド後のイベントは1つのコマンドしか受け取らないようで、複数のコマンドを呼び出す必要がある場合は、コマンドを* .batファイルに入れて、ビルド後のイベントから呼び出す必要があります。

それは正しいですか、またはビルド後のイベントから2つのコマンドを呼び出す簡単な方法はありますか?よろしくお願いします。

回答:


124

ビルド後のコマンドはいくつでも入力できます。改行で区切るだけです。

これが私のプロジェクトの例です。

ビルドイベント後のコマンドライン


3
スクリーンショットを含めることは、それを永久にホストするつもりである場合にのみ役立ちます。
アマンダリシャス2012年

1
@ OWenJ23 ...またはこの場合は 'imageshack';)
Anthony Walsh

27
別の行にあるにもかかわらず、私のコマンドは、それらが単一の行にあるかのように一緒に実行されています。
Trevor

6
残念ながら、中間のコマンドの1つが失敗しても、少なくともVS2015はエラーを報告しないようです...ビルド後のステップの結果として、最後のコマンドの結果を報告します。
ヨハネスS.

3
これはVisual Studio内から機能するようですが、TFSビルドマシンでMsBuildを使用する場合はサポートされません。MsBuildは改行を取り除き、構文が正しくないためにコマンドが失敗します。
ジェフB

107

重要:バッチファイルを実行するときは、次の行を実行するために「call」ステートメントを使用する必要があります。「call」を使用しない場合、実行は.batに行われ、次の行には戻りません。DOSプロンプトと同じです。

例えば:

call MyBatch1.bat
call MyBatch2.bat

3
このヒントは、両方ともバッチファイル(grunt.cmdおよびnpm.cmd)を実行するため、gruntコマンドとnpmコマンドに適用されます。
Matt Varblow、2015年

16

別のオプションがあります&&。コマンドをで区切ることができます。例えば

copy $(TargetPath) d:\folder1 && copy $(TargetPath) d:\folder2

これは、改行で区切るのとまったく同じではありません。 &&前のコマンドが失敗した場合、次のコマンドは実行されません。

改行で区切ると読みやすくなるので、お勧めします。しかし、いつ&&役立つかは少なくとも1 つはわかっています。プロパティシートを使用して、異なるマシンで異なるビルド後の手順を実行するのは、このシナリオです。VS 2008では、プロパティシートでPostBuildStepを直接設定することはできませんが、コマンドを使用してユーザーマクロを追加し、メインプロジェクト設定から呼び出すことができます。マクロは1行なので、&&複数のコマンドを使用できます。


11

各コマンドは別々の行にある必要があります。しかし、これらのコマンドのいずれかを実行するときにエラーが発生すると、ビルド後全体が失敗するため、デバッグするためにビルド後のコマンドを1つずつ試す必要があることがわかりました。


2
"xcopy / f"を指定すると、完全なソースとターゲットのファイル名が表示され、失敗する前に出力されるため、複数のコピーコマンドよりも複数のxcopyコマンドの診断が容易になります。
ヨーヨー2014

9

コマンドを&または&&または;で区切る VS2017では機能しません。そのような単純な機能はVS2017では利用できません。Visual Studioは、ビルド後のイベントウィンドウのテキスト全体を1つの文字列として実行しようとします。今の私の唯一のオプションは、特に好きではないバッチスクリプトを作成することです。


1
&&でコマンドを分離すると、VS2017で機能します。VS2017エディターで別の行に各コマンドを指定しても機能しません。
コードスニファー2018年

5

womp答えに追加:

同じビルドイベントで何かを行うためのプロパティシートが複数ある場合は、次のようにしてコマンドをチェーンできます。

%(Command)
echo foo

どこ %(Command)は、コマンドの前の値に展開されます。

個人的には、現在コマンドを継承していない場合でも、すべてのビルドイベントに対してこれを行います。これにより、後でプロパティシートを追加しても問題が発生しないことが保証されます。


1
これは、カスタムビルドステップでも機能します。また、exitチェーンに沿ってバッチステートメントを実行すると、チェーンが中止されます。実際、ステップを中止してビルドが続行exit 1している間はビルドが失敗しexit 0ます。
Martin Connell

3

Visual Studio 2017ではこれを行うことができます:

<PostBuildEvent>
    <Command>
        copy $(TargetPath) $(SolutionDIr)\bin1
        copy $(TargetPath) $(SolutionDIr)\bin2
    </Command>
</PostBuildEvent>

1
.csprojを編集し、2つのポストビルドイベントコマンドの周りに<Command> </ Command>を追加しました。それはうまくいかなかったようです。Visual Studioでビルドイベントを調べたところ、2つのコマンドの周りに<Command> </ Command>がありましたが、ビルドエラーが発生しました:コマンド "<Command xmlns =" .. "> command1 command2 </ Command>"コード255でexitted
ジミー・

1

wompが提案するアプローチは、Visual Studio 2015/2017(Windows)では機能しますが、最初のコマンドのみを実行するように見えるVisual Studio for Mac(プレビュー)では機能しません。Mac版とWindows版の両方のVisual Studioで機能することがわかった唯一のアプローチは、2つのMSBuildコマンドをチェーンすることでした。

<Target Name="AfterResolveReferences">
<Exec Command="path\MyFirstCommand.exe -parameters" />
</Target>
<Target Name="MySecondCommand" AfterTargets="AfterResolveReferences" >
<Exec Command="path\MySecondCommand.exe -parameters" />
</Target>

上記の例では「AfterResolveReferences」イベントを使用していますが、PostBuildイベントでも動作するはずです。


1

この問題に対する適切な解決策はありません。呼び出しのアイデアにより、他のスクリプトが実行されます。エラー検出が機能しないことに気づきました。'exit / b 1'をFailMe.cmdに入れますビルド後の手順で 'call FailMe.cmd'を使用します。ビルドは失敗しませんか?私はVS 2017を使用してC#プロジェクトを構築しています。'FailMe.cmd'で試してください。ビルドでエラーが報告されます。

したがって、エラー報告が重要な場合は、単一のスクリプトを使用する方がよいでしょう。


-4

バッチスクリプトの前に「call」を付けるだけです。そのため、バッチスクリプトからの呼び出しを返した後に、バッチスクリプトの下のステートメントも実行されます。

call Script1.cmd
call Script2.bat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.