msbuildを使用してアイテムリスト内のファイルが存在するかどうかを確認するにはどうすればよいですか?
-
03-07-2019 - |
質問
アイテムリスト内のファイルが見つからない場合、タスクを実行したいと思います。どうすればいいですか?
現在のスクリプトには、「ソース」のリストがあります。 " destination"の別のリストを翻訳したファイル@(MyComFiles)ファイル@(MyInteropLibs)、次のタスクを使用:
<CombinePath BasePath="$(MyPath)\interop"
Paths="@(MyComFiles->'%(filename).%(extension)')">
<Output TaskParameter="CombinedPaths"
ItemName="MyInteropLibs" />
</CombinePath>
@(MyInteropLibs)のファイルのいずれかが欠落しているかどうかを確認し、それらを作成するタスクを実行します。
解決
私はMSBuildをあまり経験していないので、これよりも良い解決策があるかもしれませんが、ファイルリストを取得して各ファイルをFile.Existsに渡すFilesExistタスクを書くことができます。結果に基づいて
申し訳ありませんが、支援するコードを提供することはできません。MSBuild構文に関する私の知識は強くありません
他のヒント
不足しているファイルのみを作成し、不足しているファイルのリストを取得する必要がない場合は、タッチタスク。ファイルが存在しない場合に作成されます。
<Touch Files="@(MyInteropLibs)" AlwaysCreate="True" />
不足しているファイルのみを作成し、既存のファイルのタイムスタンプの変更を避けたい場合は、バッチ処理が役立ちます
<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True"
Condition=" ! Exists(%(MyInteropLibs.FullPath)) "/>
作成されたファイルのリストが必要な場合
<Touch Files="%(MyInteropLibs.FullPath)" AlwaysCreate="True"
Condition=" ! Exists(%(MyInteropLibs.FullPath)) ">
<Output TaskParameter="TouchedFiles" ItemName="CreatedFiles"/>
</Touch>
<Message Text="Created files = @(CreatedFiles)"/>
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に設定し、見つからない場合はゼロ以外に設定します。 (これはより簡単なケースですが、元の質問に対処しない ...)
<!-- Any exists -->
<Exec Command="dir /B @(MyFiles)" IgnoreExitCode="true">
<Output TaskParameter="ExitCode" PropertyName="DirExitCode"/>
</Exec>
その後、ほとんどの場合、出力に基づいてブールプロパティを定義します。
編集:ところで、これはコードのにおいです。通常、これを行いたい場合は、ターゲットのOutputsプロパティを設定して、アイテムをループ処理する必要があることを示しています。