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.
Verwante inhoud
U kunt ook kenmerken gebruiken om bewerkingen uit te voeren op itemlijsten, zoals filteren op metagegevens van items. Zie Itemsvoor meer informatie.