Práce s funkcemi položek

Kód v úkolech a cílech může volat funkce položek pro získání informací o položkách v projektu (v MSBuildu 4.0 a novějších). Tyto funkce zjednodušují získávání jedinečných položek a jsou rychlejší než procházení položek.

Funkce řetězcových položek

Pomocí řetězcových metod a vlastností v rozhraní .NET Framework můžete pracovat s libovolnou hodnotou položky. Pro String metody zadejte název metody. U String vlastností zadejte název vlastnosti za "get_".

U položek, které mají více řetězců, se metoda řetězce nebo vlastnost spouští na každém řetězci.

Následující příklad ukazuje, jak používat tyto funkce položek řetězce.

<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
  -->

Vnitřní funkce položek

Následující tabulka uvádí vnitřní funkce dostupné pro položky.

Funkce Příklad Popis
Combine @(MyItems->Combine('path')) Vrátí novou sadu položek s danou relativní cestou připojenou ke všem vstupním položkám.
Count @(MyItems->Count()) Vrátí počet položek.
DirectoryName @(MyItems->DirectoryName()) Vrátí ekvivalent Path.DirectoryName pro každou položku.
Distinct @(MyItems->Distinct()) Vrátí položky, které mají jedinečné Include hodnoty. Metadata se ignorují. Porovnání nerozlišuje malá a velká písmena.
DistinctWithCase @(MyItems->DistinctWithCase()) Vrátí položky, které mají jedinečné itemspec hodnoty. Metadata se ignorují. V porovnání se rozlišují malá a velká písmena.
Exists @(MyItems->Exists()) Filtruje sadu položek na položky, které na disku skutečně existují.
GetPathsOfAllDirectoriesAbove @(MyItems->GetPathsOfAllFilesAbove()) Vzhledem k sadě položek vrátí položky představující všechny nadřazené adresáře. Není zaručená žádná objednávka.
Reverse @(MyItems->Reverse()) Vrátí položky v obráceném pořadí.
AnyHaveMetadataValue @(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) boolean Vrátí hodnotu označující, jestli má každá položka zadaný název a hodnotu metadat. Porovnání nerozlišuje malá a velká písmena.
ClearMetadata @(MyItems->ClearMetadata()) Vrátí položky s odstraněnými metadaty. Zachovají se pouze tyto itemspec .
HasMetadata @(MyItems->HasMetadata("MetadataName")) Vrátí položky s daným názvem metadat. Porovnání nerozlišuje malá a velká písmena.
Metadata @(MyItems->Metadata("MetadataName")) Vrátí hodnoty metadat, která mají název metadat. Vrácené položky mají stejná metadata jako zdrojové hodnoty.
WithMetadataValue @(MyItems->WithMetadataValue("MetadataName", "MetadataValue")) Vrátí položky s daným názvem a hodnotou metadat. Porovnání nerozlišuje malá a velká písmena.

Poznámka:

Exists lze použít také v jiných kontextech; v podmínkách MSBuild, například Condition="Exists('path')"; nebo ve statických funkcích vlastností, například $([System.IO.File]::Exists("path")).

Následující příklad ukazuje, jak používat vnitřní funkce položek.

<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
  -->

Detekce duplicit při použití funkce položky metadat

Funkce Metadata item zachovává původní metadata zdrojových položek. To má určité důsledky při zvažování, jestli jsou vrácené položky duplicitní nebo ne. K řízení způsobu zpracování duplicitních položek můžete použít atribut KeepDuplicates. Metadata můžete také odebrat, pokud není potřeba, přidáním RemoveMetadata, v takovém případě se při zjišťování duplicit považují pouze samotné hodnoty.

  <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>

Výstup je následující:

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

Následující změna kódu způsobí úspěšné zjištění a odebrání duplicitní hodnoty položky:

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

Funkce podmínek nástroje MSBuild

HasTrailingSlash Funkce není funkce položky. Je k dispozici pro použití s atributem Condition . Viz podmínky nástroje MSBuild.

Můžete také použít atributy k provádění operací se seznamy položek, jako je filtrování podle metadat položek. Další informace naleznete v tématu Položky.