2009-04-29 11 views
7

アイテムリストのファイルがない場合、タスクを実行したいと思います。それ、どうやったら出来るの?msbuildを使用してアイテムリスト内のファイルが存在するかどうかを確認するにはどうすればよいですか?

私の現在のスクリプトは、「ソース」ファイルのリストを持っている@私は「目的地」のファイルの別のリストを翻訳することを(MyComFiles)@(MyInteropLibs)、次のタスク使用:

<CombinePath BasePath="$(MyPath)\interop" 
      Paths="@(MyComFiles->'%(filename).%(extension)')"> 
    <Output TaskParameter="CombinedPaths" 
      ItemName="MyInteropLibs" /> 
</CombinePath> 

私が確認したいの@(MyInteropLibs)内のファイルのいずれかが見つからない場合、それらを作成するタスクを実行します。

答えて

3

私はMSBuildをあまり経験していないので、これより優れた解決策があるかもしれませんが、ファイルリストを取得し、各ファイルをFile.Existsに渡して、存在すればtrueを返し、そうでなければfalseを返します結果

ファイルのリストを取得私は、助けるためにコードを提供することができないあなただけ不足しているファイルを作成する必要がある場合のMSBuild sytaxの私の知識では

+0

私はむしろmsbuildでやります。タスクのConditional属性にExists()関数を使用することは可能ですが、1つのファイルに対してのみ機能します。 –

+2

MSBuildには機能が組み込まれているようには見えません.MSBuild Extension PackやMSBuild Community Tasksにはこのような機能はありません。 Crippledsmurfが示唆するように、必要な作業を行う独自のカスタムMSBuildタスクを作成できます。その後、ビルドファイル内のdllを参照し、必要に応じてタスクを呼び出します。 – Pedro

4

強くない、とない申し訳ありませんに基づいて反応しますファイルが存在しない場合は、touch taskが作成されます。あなただけ不足しているファイルを作成し、既存のファイルのタイムスタンプを変更しないようにしたい場合は、

、その後に作成されたファイルのリストをしたい場合は、バッチ処理が

<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True" 
     Condition=" ! Exists(%(MyInteropLibs.FullPath)) "/> 

を助けることができる

<Touch Files="@(MyInteropLibs)" AlwaysCreate="True" /> 

<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True" 
     Condition=" ! Exists(%(MyInteropLibs.FullPath)) "> 
    <Output TaskParameter="TouchedFiles" ItemName="CreatedFiles"/> 
</Touch> 
<Message Text="Created files = @(CreatedFiles)"/> 
0

非常に簡単に「Exec」を使用して見つけることができます。

すべてのファイルセットが存在するかどうかをテストするには:DOS FOR/Dコマンドはセミコロンで区切られたファイルのリスト、つまりフラット化されたアイテム配列を受け入れます。ファイルのセットのいずれかどうかをテストするには

<!-- All exist --> 
<Exec 
    Command="for /D %%i in (@(MyFiles)) do if not exist %%i exit 1" 
    IgnoreExitCode="true"> 
    <Output TaskParameter="ExitCode" PropertyName="ExistExitCode"/> 
</Exec> 

が存在します。DOS DIRコマンドは、ファイルのセミコロン区切りのリストを受け入れます。リストにファイルがあれば%ERRORLEVEL%を0に設定し、見つからない場合は0以外を設定します。そして、あなたは出力に基づいてブールプロパティを定義したいと思うでしょう最も可能性が高い

<!-- Any exists --> 
<Exec Command="dir /B @(MyFiles)" IgnoreExitCode="true"> 
    <Output TaskParameter="ExitCode" PropertyName="DirExitCode"/> 
</Exec> 

(...これは単純なケースですが、それはないアドレス元の質問ません)。

EDIT:これはコードの匂いです。通常、これを実行したいときは、ターゲットのOutputsプロパティを設定して項目をループさせる必要があることを示しています。

関連する問題