次の方法で共有


アイテム関数を操作する

タスクとターゲット内のコードは、項目関数を呼び出してプロジェクト内の項目に関する情報を取得できます (MSBuild 4.0 以降)。 これらの関数は、個別の項目の取得を簡略化し、項目をループ処理するよりも高速です。

文字列項目関数

.NET Framework で文字列メソッドとプロパティを使用して、任意の項目値を操作できます。 Stringメソッドの場合は、メソッド名を指定します。 Stringプロパティの場合は、"get_" の後にプロパティ名を指定します。

複数の文字列を持つ項目の場合、文字列メソッドまたはプロパティは各文字列で実行されます。

次の例は、これらの文字列項目関数を使用する方法を示しています。

<ItemGroup>
    <theItem Include="andromeda;tadpole;cartwheel" />
</ItemGroup>

<Target Name = "go">
    <Message Text="IndexOf  @(theItem->IndexOf('r'))" />
    <Message Text="Replace  @(theItem->Replace('tadpole', 'pinwheel'))" />
    <Message Text="Length   @(theItem->get_Length())" />
    <Message Text="Chars    @(theItem->get_Chars(2))" />
</Target>

  <!--
  Output:
    IndexOf  3;-1;2
    Replace  andromeda;pinwheel;cartwheel
    Length   9;7;9
    Chars    d;d;r
  -->

組み込み項目関数

次の表に、項目で使用できる組み込み関数を示します。

機能 Example Description
Combine @(MyItems->Combine('path')) 指定した相対パスがすべての入力項目に追加された項目の新しいセットを返します。
Count @(MyItems->Count()) 項目の数を返します。
DirectoryName @(MyItems->DirectoryName()) 各項目の Path.DirectoryName に相当する値を返します。
Distinct @(MyItems->Distinct()) 個別の Include 値を持つ項目を返します。 メタデータは無視されます。 比較では大文字と小文字が区別されません。
DistinctWithCase @(MyItems->DistinctWithCase()) 個別の itemspec 値を持つ項目を返します。 メタデータは無視されます。 比較では大文字と小文字が区別されます。
Exists @(MyItems->Exists()) 一連の項目を、ディスク上に実際に存在するものにフィルター処理します。
GetPathsOfAllDirectoriesAbove @(MyItems->GetPathsOfAllFilesAbove()) 一連の項目を指定すると、すべての先祖ディレクトリを表す項目が返されます。 注文は保証されません。
Reverse @(MyItems->Reverse()) 項目を逆の順序で返します。
AnyHaveMetadataValue @(MyItems->AnyHaveMetadataValue('MetadataName', 'MetadataValue')) 指定したメタデータの名前と値を持つ項目があるかどうかを示す boolean を返します。 比較では大文字と小文字が区別されません。
ClearMetadata @(MyItems->ClearMetadata()) メタデータがクリアされたアイテムを返します。 itemspecのみが保持されます。
HasMetadata @(MyItems->HasMetadata('MetadataName')) 指定されたメタデータ名を持つ項目を返します。 比較では大文字と小文字が区別されません。
Metadata @(MyItems->Metadata('MetadataName')) メタデータ名を持つメタデータの値を返します。 返される項目のメタデータは、ソース値と同じです。
WithMetadataValue @(MyItems->WithMetadataValue('MetadataName', 'MetadataValue')) 指定されたメタデータの名前と値を持つ項目を返します。 比較では大文字と小文字が区別されません。
WithoutMetadataValue @(MyItems->WithoutMetadataValue('MetadataName', 'MetadataValue')) (MSBuild 17.8 以降)指定されたメタデータ値を持たない項目を返します。 比較では大文字と小文字が区別されません。

Exists は、他のコンテキストでも使用できます。 MSBuild の条件 (たとえば、 Condition="Exists('path')"; や 静的プロパティ関数など) では、 $([System.IO.File]::Exists("path"))

次の例は、組み込みの項目関数を使用する方法を示しています。

<ItemGroup>
    <TheItem Include="first">
        <Plant>geranium</Plant>
    </TheItem>
    <TheItem Include="second">
        <Plant>algae</Plant>
    </TheItem>
    <TheItem Include="third">
        <Plant>geranium</Plant>
    </TheItem>
</ItemGroup>

<Target Name="go">
    <Message Text="MetaData:    @(TheItem->Metadata('Plant'))" />
    <Message Text="HasMetadata: @(theItem->HasMetadata('Plant'))" />
    <Message Text="WithMetadataValue: @(TheItem->WithMetadataValue('Plant', 'geranium'))" />
    <Message Text=" " />
    <Message Text="Count:   @(theItem->Count())" />
    <Message Text="Reverse: @(theItem->Reverse())" />
</Target>

  <!--
  Output:
    MetaData:    geranium;algae;geranium
    HasMetadata: first;second;third
    WithMetadataValue: first;third

    Count:   3
    Reverse: third;second;first
  -->

String メソッドの呼び出し

シナリオに一致する項目関数を使用できない場合は、 new プロパティ関数を使用してメタデータから文字列オブジェクトを作成し、その String メソッドを呼び出すことで、同様の効果を得ることができます。 たとえば、次のコードでは、サブ文字列検索を使用してターゲット内の項目リストをフィルター処理します。

<Project>
  <PropertyGroup>
    <SearchString>abc</SearchString>
  </PropertyGroup>

  <ItemGroup>
    <UnfilteredList Include="abcdef;abc;def;xyz"></UnfilteredList>
  </ItemGroup>

  <Target Name="FilterItemList">

    <ItemGroup>
      <FilteredList Include="@(UnfilteredList)" Condition="$([System.String]::new('%(UnfilteredList.Identity)').Contains($(SearchString)))"></FilteredList>
    </ItemGroup>

    <Message Text="Result: @(FilteredList)"/>
  </Target>
</Project>

メタデータ項目関数を使用する場合の重複の検出

Metadata項目関数は、ソース項目の元のメタデータを保持します。 これは、返される項目が重複しているかどうかを検討する際にいくつかの影響があります。 重複する項目の処理方法を制御するには、 KeepDuplicates 属性を使用します。 必要ない場合は、 RemoveMetadata を追加してメタデータを削除することもできます。この場合、重複を検出するときに値自体のみが考慮されます。

  <Target Name="MetadataToItem">
    <ItemGroup>
      <Sample Include="AAA" SomeItems="1;2;3" />
      <Sample Include="BBB" SomeItems="3;4;5" />
    </ItemGroup>

    <ItemGroup>
      <AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" />
    </ItemGroup>
    <Message Text="AllSomeItems is @(AllSomeItems)" />
  </Target>

出力は次のとおりです。

MetadataToItem:
  AllSomeItems is 1;2;3;3;4;5

コードに対する次の変更により、重複する項目の値が正常に検出され、削除されます。

    <ItemGroup>
      <AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" RemoveMetadata="SomeItems" />
    </ItemGroup>

MSBuild 条件関数

HasTrailingSlash関数は項目関数ではありません。 Condition属性で使用できます。 MSBuild の条件を参照してください。

属性を使用して、項目のメタデータに対するフィルター処理など、項目リストに対する操作を実行することもできます。 詳細については、「項目」を参照してください。