Arbeiten mit Elementfunktionen
Code in Aufgaben und Zielen kann Elementfunktionen aufrufen, um Informationen zu den Elementen im Projekt zu erhalten (MSBuild 4.0 und höher). Diese Funktionen vereinfachen das Abrufen von distinct-Elementen, und mit ihnen erfolgt der Abruf schneller als beim Durchlaufen der Elemente.
Zeichenfolgenelementfunktionen
Sie können Zeichenfolgenmethoden und -eigenschaften in .NET Framework für jeden Elementwert verwenden. Geben Sie für String-Methoden den Methodennamen an. Geben Sie für String-Eigenschaften den Eigenschaftennamen hinter „get_“ an.
Für Elemente mit mehreren Zeichenfolgen wird die Zeichenfolgenmethode oder -eigenschaft für jede Zeichenfolge ausgeführt.
Das folgende Beispiel veranschaulicht die Verwendung dieser Zeichenfolgenelementfunktionen.
<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
-->
Intrinsische Elementfunktionen
In der unten stehenden Tabelle werden die systeminternen Funktionen aufgelistet, die für Elemente zur Verfügung stehen.
Funktion | Beispiel | Beschreibung |
---|---|---|
Combine |
@(MyItems->Combine('path')) |
Gibt eine neue Gruppe von Elementen mit einem bestimmten relativen Pfad zurück, der an alle Eingabeelemente angefügt wird |
Count |
@(MyItems->Count()) |
Gibt die Anzahl der Elemente zurück |
DirectoryName |
@(MyItems->DirectoryName()) |
Gibt das entsprechende Path.DirectoryName -Objekt für jedes Element zurück |
Distinct |
@(MyItems->Distinct()) |
Gibt Elemente zurück, die eindeutige Include -Werte aufweisen Metadaten werden ignoriert. Beim Vergleich wird die Groß- und Kleinschreibung nicht berücksichtigt. |
DistinctWithCase |
@(MyItems->DistinctWithCase()) |
Gibt Elemente zurück, die eindeutige itemspec -Werte aufweisen Metadaten werden ignoriert. Beim Vergleich wird die Groß- und Kleinschreibung berücksichtigt. |
Exists |
@(MyItems->Exists()) |
Filtert eine Gruppe von Elementen nach Elementen, die tatsächlich auf dem Datenträger vorhanden sind |
GetPathsOfAllDirectoriesAbove |
@(MyItems->GetPathsOfAllFilesAbove()) |
Gibt bei einer Gruppe von Elementen Elemente zurück, die alle Vorgängerverzeichnisse darstellen (ohne garantierte Reihenfolge) |
Reverse |
@(MyItems->Reverse()) |
Gibt die Elemente in umgekehrter Reihenfolge zurück |
AnyHaveMetadataValue |
@(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) |
Gibt einen boolean -Wert zurück, der angibt, ob ein Element einen angegebenen Metadatennamen und -wert aufweist. Beim Vergleich wird die Groß- und Kleinschreibung nicht berücksichtigt. |
ClearMetadata |
@(MyItems->ClearMetadata()) |
Gibt Elemente mit gelöschten Metadaten zurück. Nur das itemspec -Objekt wird beibehalten. |
HasMetadata |
@(MyItems->HasMetadata("MetadataName")) |
Gibt Elemente zurück, die den angegebenen Metadatennamen aufweisen Beim Vergleich wird die Groß- und Kleinschreibung nicht berücksichtigt. |
Metadata |
@(MyItems->Metadata("MetadataName")) |
Gibt die Werte der Metadaten zurück, die den Metadatennamen aufweisen Die zurückgegebenen Elemente weisen die gleichen Metadaten auf wie die Quellwerte. |
WithMetadataValue |
@(MyItems->WithMetadataValue("MetadataName", "MetadataValue")) |
Gibt Elemente zurück, die den angegebenen Metadatennamen und -wert aufweisen. Beim Vergleich wird die Groß- und Kleinschreibung nicht berücksichtigt. |
Hinweis
Exists
kann auch in anderen Kontexten, in MSBuild-Bedingungen (beispielsweise Condition="Exists('path')"
) oder in statischen Eigenschaftenfunktionen (beispielsweise $([System.IO.File]::Exists("path"))
) verwendet werden.
In folgendem Beispiel wird veranschaulicht, wie Sie systeminterne Elementfunktionen verwenden können.
<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
-->
Erkennen von Duplikaten bei Verwendung der Metadatenelementfunktion
Die Elementfunktion Metadata
behält die ursprünglichen Metadaten der Quellelemente bei. Dies hat Auswirkungen hinsichtlich der Beurteilung, ob es sich bei den zurückgegebenen Elementen um Duplikate handelt oder nicht. Um zu steuern, wie doppelte Elemente behandelt werden, können Sie das Attribut KeepDuplicates verwenden. Sie können die Metadaten auch entfernen, wenn sie nicht benötigt werden, indem Sie RemoveMetadata hinzufügen. In diesem Fall werden bei der Erkennung von Duplikaten nur die Werte selbst berücksichtigt.
<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>
Die Ausgabe lautet wie folgt:
MetadataToItem:
AllSomeItems is 1;2;3;3;4;5
Die folgende Codeänderung führt dazu, dass der doppelte Elementwert erfolgreich erkannt und entfernt wird:
<ItemGroup>
<AllSomeItems Include="@(Sample->Metadata('SomeItems'))" KeepDuplicates="false" RemoveMetadata="SomeItems" />
</ItemGroup>
MSBuild-Bedingungsfunktionen
Die Funktion HasTrailingSlash
ist keine Elementfunktion. Sie kann mit dem Attribut Condition
verwendet werden. Weitere Informationen finden Sie unter MSBuild-Bedingungen.
Zugehöriger Inhalt
Sie können auch Attribute verwenden, um Vorgänge für Elementlisten auszuführen und beispielsweise nach Elementmetadaten zu filtern. Weitere Informationen finden Sie unter Elemente.