Delen via


Aan de slag met item functies

Code in taken en doelen kan itemfuncties aanroepen om informatie over de items in het project op te halen (in MSBuild 4.0 en hoger). Deze functies vereenvoudigen het ophalen van afzonderlijke items en zijn sneller dan het doorlopen van de items.

Functies voor tekenreeksitems

U kunt tekenreeksmethoden en -eigenschappen in .NET Framework gebruiken om te werken op elke itemwaarde. Geef voor String methoden de naam van de methode op. Geef voor String eigenschappen de naam van de eigenschap op na 'get_'.

Voor items met meerdere tekenreeksen wordt de tekenreeksmethode of eigenschap op elke tekenreeks uitgevoerd.

In het volgende voorbeeld ziet u hoe u deze tekenreeksitemfuncties gebruikt.

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

Intrinsieke item functies

De onderstaande tabel bevat de intrinsieke functies die beschikbaar zijn voor items.

Functie Voorbeeld Beschrijving
Combine @(MyItems->Combine('path')) Retourneert een nieuwe set items met een bepaald relatief pad dat is toegevoegd aan alle invoeritems.
Count @(MyItems->Count()) Retourneert het aantal items.
DirectoryName @(MyItems->DirectoryName()) Retourneert het equivalent van Path.DirectoryName voor elk item.
Distinct @(MyItems->Distinct()) Retourneert items met verschillende Include waarden. Metagegevens worden genegeerd. De vergelijking is niet hoofdlettergevoelig.
DistinctWithCase @(MyItems->DistinctWithCase()) Retourneert items met verschillende itemspec waarden. Metagegevens worden genegeerd. De vergelijking is hoofdlettergevoelig.
Exists @(MyItems->Exists()) Hiermee filtert u een set items naar items die daadwerkelijk op schijf aanwezig zijn.
GetPathsOfAllDirectoriesAbove @(MyItems->GetPathsOfAllFilesAbove()) Met een set items worden items geretourneerd die alle bovenliggende directories vertegenwoordigen. Er is geen bestelling gegarandeerd.
Reverse @(MyItems->Reverse()) Retourneert de items in omgekeerde volgorde.
AnyHaveMetadataValue @(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) Retourneert een boolean om aan te geven of een item de opgegeven metagegevensnaam en -waarde heeft. De vergelijking is ongevoelig voor hoofdlettergebruik.
ClearMetadata @(MyItems->ClearMetadata()) Retourneert items waarvan de metadata is gewist. Alleen de itemspec wordt bewaard.
HasMetadata @(MyItems->HasMetadata("MetadataName")) Retourneert items met de opgegeven naam van de metagegevens. De vergelijking is niet hoofdlettergevoelig.
Metadata @(MyItems->Metadata("MetadataName")) Retourneert de waarden van de metagegevens met de naam van de metagegevens. De geretourneerde items hebben dezelfde metagegevens als de bronwaarden.
WithMetadataValue @(MyItems->WithMetadataValue("MetadataName", "MetadataValue")) Retourneert items met de opgegeven metagegevensnaam en -waarde. De vergelijking is niet hoofdlettergevoelig.

Notitie

Exists kan ook in andere contexten worden gebruikt; in MSBuild voorwaarden, bijvoorbeeld Condition="Exists('path')"; of in statische eigenschapsfuncties, bijvoorbeeld $([System.IO.File]::Exists("path")).

In het volgende voorbeeld ziet u hoe u intrinsieke itemfuncties gebruikt.

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

Een tekenreeksmethode aanroepen

Als een itemfunctie niet beschikbaar is die overeenkomt met uw scenario, kunt u een vergelijkbaar effect bereiken door een tekenreeksobject te maken op basis van de metagegevens met behulp van de eigenschapsfunctie new en een String methode erop aan te roepen. In de volgende code wordt bijvoorbeeld een subtekenreekszoekopdracht gebruikt om een itemlijst in een doel te filteren.

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

Duplicaten detecteren bij gebruik van de functie Metadata-item

De functie Metadata item behoudt de oorspronkelijke metagegevens van de bronitems. Dit heeft enkele gevolgen bij het overwegen of de geretourneerde items duplicaten zijn of niet. Als u wilt bepalen hoe dubbele items worden verwerkt, kunt u het kenmerk KeepDuplicatesgebruiken. U kunt ook de metagegevens verwijderen, als dit niet nodig is, door de RemoveMetadata-toe te voegen. In dat geval worden alleen de waarden zelf overwogen bij het detecteren van duplicaten.

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

De uitvoer is als volgt:

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

De volgende wijziging in de code resulteert in het detecteren en verwijderen van de dubbele itemwaarde:

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

MSBuild-voorwaardefuncties

De functie HasTrailingSlash is geen itemfunctie. Het is beschikbaar voor gebruik met het kenmerk Condition. Zie MSBuild voorwaarden.

U kunt ook kenmerken gebruiken om bewerkingen uit te voeren op itemlijsten, zoals filteren op metagegevens van items. Zie Itemsvoor meer informatie.