2016-12-02 27 views
0

私はNMakeBuildCommandLineセクションに明示的なWindowsのシェルコマンドが含まれているvcxprojファイルを持っていますまたはslnファイルを介して。問題はfile1が存在しない場合、出力は非常に助けにならないでも、ファイルの名前が表示されないということです。コードの再利用

if exist file1 (move file1 file2) else (echo file1 does not exist && exit 1) 

(注:

The system cannot find the file specified. 

私の素朴な解決策は、とmove file1 file2を交換することです

これはうまくいきますが、私はfile1を1行に3回入力してすべて一致する必要があるため、エラーが発生しやすいです。 file1は、移動する必要がある多くのファイルのうちの1つです。さらに、一連のコマンドは、さまざまなビルド構成でほぼ同じです。

コマンドラインとビルド構成の両方で自分自身を繰り返さないようにするにはどうすればよいですか?私はUserMacrosプロパティグループが助けになると思っていましたが、IDE経由でマクロを書く方法を理解できませんでした。 (Visual Studioでプロジェクトを右クリックすると、ユーザーマクロを入力するフィールドが表示されません)また、インターネット上でこのセクションの構文についての議論を見つけることもできないので、マクロを書く方法はわかりませんでした。テキストエディタ(私は実際にそれを好むだろう)。

vcxprojファイル内には、存在する必要があるファイルを識別するためのより良い方法があるかもしれません。そのため、私は任意の選択肢に対応しています。

+1

のプロパティを使用する方法を見上げて起動するのがベスト:最後のステップは、この目標は、ファイル自体にMSBuildのを呼び出し、ターゲットを実行するように指示するだけで行われているのnmakeコマンドラインから起動得ることですmsbuild。テキストエディタでvcxprojを開き、パス/ to /ファイルをPropertyGroupに追加し、 'if exist $(file1)...'を使用しますか? – stijn

+0

@stijn、それは私が探していた情報です。できます。あなたがそれを答えにするなら、私はそれをアップヴォートし、(何か良いものがなければ)それを選択します。ありがとう! – Alan

答えて

1

MsBuildには、propertiesと呼ばれる他のほとんどのプログラミング言語のような「変数」があります。プロジェクトファイルxmlのPropertyGroup要素に宣言し、$(PropertyName)構文を使用して再利用します。あなたの場合の例:あなたは値をたくさん持っている場合は退屈かもしれませんIDEを使用したい場合、あなたは確かに、いわゆるUserMacrosを使用することができますが、あなたはproprtyシートにそれらを宣言する必要が

<PropertyGroup> 
    <Src>/path/to/my/src</Src> 
    <Dst>/path/to/my/dst</Dst> 
</PropertyGroup> 

<NMakeBuildCommandLine> 
if exist $(Src) (move $(Src) $(Dst)) else (echo $(Src) does not exist &amp;&amp; exit 1) 
</NMakeBuildCommandLine> 

。 [表示] - > [プロパティーマネージャー]に移動し、プロジェクトを右クリックして[新しいプロパティシートを追加]を選択します。それをダブルクリックし、「ユーザーマクロ」に移動して、そこにキーと値のペアを追加します。すべてを保存して、生成されたファイルを見ると、vcxprojは今度はプロパティシートをインポートし、プロパティシート自体は上記のようなPropertyGroupを持っていますが、IDEよりも編集可能です。

長期的には、ファイルの存在とファイルの移動をチェックするためにMsBuildコードを使用することができます(重複の少ない、自動化が容易な)代替方法として、moveコマンドを1回書くだけでよいitemsを超えるMsBuild loopを持つことができます。これらはItemGroupで宣言されています。ここですべてを説明するのは少し範囲外であるが、一例は、物事を明確にする必要があります。

<Target Name="BatchMove"> 
    <ItemGroup> 
    <SrcFiles Include="file1"> 
     <Dest>file2</Dest> 
    </SrcFiles> 
    <SrcFiles Include="file3"> 
     <Dest>file4</Dest> 
    </SrcFiles> 
    </ItemGroup> 
    <Warning Text="Source file %(SrcFiles.Identity) does not exist" Condition="!Exists(%(SrcFiles.Identity))" /> 
    <Move SourceFiles="%(SrcFiles.Identity)" DestinationFiles="%(SrcFiles.Dest)" Condition="Exists(%(SrcFiles.Identity))" /> 
</Target> 

これは、2つのソースファイルfile1を/ファイル3とそれぞれの宛先ファイルFILE2/FILE4を宣言します。ソースが存在しない場合(標準のMsBuild Existsチェックを使用)、メッセージが表示されます。それ以外の場合は、宛先に移動されます。それらの%文字は、それらがSrcFilesコレクションの各要素のループで発生する行を作成します。さらにファイルを追加するには、ItemGroupに追加するだけです。おそらく

<NMakeBuildCommandLine> 
msbuild $(MSBuildThisFile) /t:BatchMove 
</NMakeBuildCommandLine>