2

セミコロンで区切られた文字列のリストを渡したいです。
各文字列はファイル名を表します。

    <PropertyGroup>
          <FileNames>Newtonsoft.Json;Reactive</FileNames>
          <PathToOutput>C:/</PathToOutput>
    </PropertyGroup>

ここで、ファイル名のリストを除く特定のフォルダー内のすべてのファイルを提供する項目グループを作成したいと思います。

<ItemGroup>
    <ReleaseFiles Include="$(PathToOutput)\**\*.*" Exclude="%(identity)-> identity.contains(%FileNames)"/>
</ItemGroup>

Filenames 変数にいずれかのファイル名が含まれている場合、現在のフォルダーのファイルを反復処理し、それぞれの名前と一致させるにはどうすればよいですか。

4

2 に答える 2

2

これは確かに重複していますが、現時点では見つけることができないので、ここに示します。

  • セミコロンで区切られたプロパティをアイテムに変換するには、単に使用するだけですInclude=$(Property)
  • Exclude完全一致のリストがある場合にのみ機能しますが、ここではさらに任意のフィルタリングが必要なので、Condition
  • ReleaseFiles アイテムの FileNames メタデータを作成することにより、クロス積のように 2 つの ItemGroup を結合します。次に、ReleaseFiles の各項目を反復処理し、同時に FileNames にアクセスできます
  • Containsはプロパティ関数 (または System::String メソッド) であるため、メタデータに対しては機能しません。そのため、最初にメタデータを文字列に変換します。

コード内:

<PropertyGroup>
  <FileNames>Newtonsoft.Json;Reactive</FileNames>
  <PathToOutput>C:/</PathToOutput>
</PropertyGroup>

<Target Name="FilterBasedCommaSeperatedProperty">
  <ItemGroup>
    <!-- property -> item -->
    <Excl Include="$(FileNames)"/>
    <!-- list all and add metadata list -->
    <AllReleaseFiles Include="$(PathToOutput)\**\*.*">
      <Excl>%(Excl.Identity)</Excl>
    </AllReleaseFiles >
    <!-- filter to get list of files we don't want -->
    <FilesToExclude Include="@(AllReleaseFiles)"
                    Condition="$([System.String]::Copy('%(FileName)').Contains('%(Excl)'))"/>
    <!-- all but the ones to exclude --> 
    <ReleaseFiles Include="@(AllReleaseFiles)" Exclude="@(FilesToExclude)"/>
  </ItemGroup>
  <Message Text="%(ReleaseFiles.Identity)" />
</Target>
于 2016-06-16T19:29:26.723 に答える
1

Exclude 属性を使用し、別の項目グループを参照することにより、項目グループからファイル ファイルを除外する標準的な方法を使用します。はるかに理解しやすくなります。

例:

<PropertyGroup>
  <PathToOutput>C:/</PathToOutput>
</PropertyGroup>

<ItemGroup>
    <FilesToExclude Include="$(PathToOutput)\**\Newtonsoft.Json" />
    <FilesToExclude Include="$(PathToOutput)\**\Reactive" />
    <ReleaseFiles Include="$(PathToOutput)\**\*.*" Exclude="@(FilesToExclude)"/>
</ItemGroup>
于 2016-06-16T21:30:53.833 に答える