Freigeben über


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.

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.