Freigeben über


Arbeiten mit Elementfunktionen

Code in Vorgängen und Zielen kann Elementfunktionen aufrufen, um Informationen zu den Elementen im Projekt (in MSBuild 4.0 und höher) abzurufen. Diese Funktionen vereinfachen das Abrufen unterschiedlicher Elemente und sind schneller als das Durchlaufen der Elemente.

String-Funktionen für Elemente

Sie können Zeichenfolgenmethoden und -eigenschaften im .NET Framework verwenden, um auf einem beliebigen Elementwert zu arbeiten. Geben Sie für String Methoden den Methodennamen an. String Geben Sie für Eigenschaften den Eigenschaftennamen nach "get_" an.

Bei Elementen mit mehreren Zeichenfolgen wird die Zeichenfolgenmethode oder -eigenschaft für jede Zeichenfolge ausgeführt.

Das folgende Beispiel zeigt, wie diese Zeichenfolgenelementfunktionen verwendet werden.

<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 folgenden Tabelle sind die systeminternen Funktionen aufgeführt, die für Elemente verfügbar sind.

Funktion Example Description
Combine @(MyItems->Combine('path')) Gibt einen neuen Satz von Elementen zurück, deren relativer Pfad an alle Eingabeelemente angefügt ist.
Count @(MyItems->Count()) Gibt die Anzahl der Elemente zurück.
DirectoryName @(MyItems->DirectoryName()) Gibt das Äquivalent von Path.DirectoryName für jedes Element zurück.
Distinct @(MyItems->Distinct()) Gibt Elemente zurück, die unterschiedliche Include Werte aufweisen. Metadaten werden ignoriert. Bei dem Vergleich wird die Groß-/Kleinschreibung nicht beachtet.
DistinctWithCase @(MyItems->DistinctWithCase()) Gibt Elemente zurück, die unterschiedliche itemspec Werte aufweisen. Metadaten werden ignoriert. Bei dem Vergleich wird die Groß-/Kleinschreibung beachtet.
Exists @(MyItems->Exists()) Filtert einen Satz von Elementen auf diejenigen, die tatsächlich auf dem Datenträger vorhanden sind.
GetPathsOfAllDirectoriesAbove @(MyItems->GetPathsOfAllFilesAbove()) Bei einer Reihe von Elementen werden Elemente zurückgegeben, die alle Vorgängerverzeichnisse darstellen. Es ist keine Bestellung garantiert.
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 den angegebenen Metadatennamen und -wert aufweist. Bei dem Vergleich wird die Groß-/Kleinschreibung nicht beachtet.
ClearMetadata @(MyItems->ClearMetadata()) Gibt Elemente zurück, deren Metadaten gelöscht wurden. Nur die itemspec wird beibehalten.
HasMetadata @(MyItems->HasMetadata('MetadataName')) Gibt Elemente zurück, die den angegebenen Metadatennamen aufweisen. Bei dem Vergleich wird die Groß-/Kleinschreibung nicht beachtet.
Metadata @(MyItems->Metadata('MetadataName')) Gibt die Werte der Metadaten zurück, die den Metadatennamen aufweisen. Die zurückgegebenen Elemente weisen dieselben Metadaten wie die Quellwerte auf.
WithMetadataValue @(MyItems->WithMetadataValue('MetadataName', 'MetadataValue')) Gibt Elemente zurück, die den angegebenen Metadatennamen und -wert aufweisen. Bei dem Vergleich wird die Groß-/Kleinschreibung nicht beachtet.
WithoutMetadataValue @(MyItems->WithoutMetadataValue('MetadataName', 'MetadataValue')) (MSBuild 17.8 und höher) Gibt Elemente zurück, die nicht über den angegebenen Metadatenwert verfügen. Bei dem Vergleich wird die Groß-/Kleinschreibung nicht beachtet.

Hinweis

Exists kann auch in anderen Kontexten verwendet werden; in MSBuild-Bedingungen, z. B Condition="Exists('path')". in Statischen Eigenschaftsfunktionen, z. B $([System.IO.File]::Exists("path")). . .

Das folgende Beispiel zeigt, wie systeminterne Elementfunktionen verwendet werden.

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

Aufrufen einer String-Methode

Wenn eine Elementfunktion nicht verfügbar ist, die Ihrem Szenario entspricht, können Sie einen ähnlichen Effekt erzielen, indem Sie mithilfe der new Eigenschaftsfunktion ein Zeichenfolgenobjekt aus den Metadaten erstellen und eine beliebige String Methode aufrufen. Der folgende Code verwendet beispielsweise eine Teilzeichenfolgensuche, um eine Elementliste in einem Ziel zu filtern.

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

Erkennen von Duplikaten bei Verwendung der Metadatenelementfunktion

Die Metadata Elementfunktion behält die ursprünglichen Metadaten der Quellelemente bei. Dies hat einige Auswirkungen, wenn Sie überlegen, ob die zurückgegebenen Elemente Duplikate sind 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 wird, indem Sie "RemoveMetadata" hinzufügen. In diesem Fall werden nur die Werte selbst berücksichtigt, wenn Duplikate erkannt werden.

  <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 Änderung am Code 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 ist für die Verwendung mit dem Condition Attribut verfügbar. Siehe MSBuild-Bedingungen.

Sie können attribute auch verwenden, um Vorgänge in Elementlisten auszuführen, z. B. filtern nach Elementmetadaten. Weitere Informationen finden Sie unter Elemente.