Share via


Usare le funzioni degli elementi

Il codice nelle attività e nelle destinazioni può chiamare funzioni elemento per ottenere informazioni sugli elementi del progetto (in MSBuild 4.0 e versioni successive). Queste funzioni semplificano l'acquisizione di elementi distinti e sono più veloci rispetto al ciclo degli elementi.

Funzioni degli elementi per i valori stringa

È anche possibile usare metodi e proprietà di stringa in .NET Framework per operare su qualsiasi valore dell'elemento. Per i metodi String, specificare il nome del metodo. Per le proprietà String, specificare il nome della proprietà dopo "get_".

Per gli elementi con più stringhe, è necessario eseguire il metodo o la proprietà di stringa per ogni stringa.

Nell'esempio seguente viene illustrato come usare le funzioni degli elementi per i valori stringa.

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

Funzioni intrinseche degli elementi

Nella tabella seguente sono elencate le funzioni intrinseche disponibili per gli elementi.

Funzione Esempio Descrizione
Combine @(MyItems->Combine('path')) Restituisce un nuovo set di elementi con un percorso relativo specificato accodato a tutti gli elementi di input.
Count @(MyItems->Count()) Restituisce il numero di elementi.
DirectoryName @(MyItems->DirectoryName()) Restituisce l'equivalente di Path.DirectoryName per ogni elemento.
Distinct @(MyItems->Distinct()) Restituisce gli elementi con valori Include distinti. I metadati vengono ignorati. Nel confronto non viene fatta distinzione tra maiuscole e minuscole.
DistinctWithCase @(MyItems->DistinctWithCase()) Restituisce gli elementi con valori itemspec distinti. I metadati vengono ignorati. Per il confronto viene applicata la distinzione tra maiuscole e minuscole.
Exists @(MyItems->Exists()) Filtra un set di elementi per quelli effettivamente esistenti su disco.
GetPathsOfAllDirectoriesAbove @(MyItems->GetPathsOfAllFilesAbove()) Dato un set di elementi, restituisce elementi che rappresentano tutte le directory predecessore. Non è garantito alcun ordine.
Reverse @(MyItems->Reverse()) Restituisce gli elementi in ordine inverso.
AnyHaveMetadataValue @(MyItems->AnyHaveMetadataValue("MetadataName", "MetadataValue")) Restituisce boolean per indicare se un elemento ha il valore e il nome dei metadati specificati. Nel confronto non viene fatta distinzione tra maiuscole e minuscole.
ClearMetadata @(MyItems->ClearMetadata()) Restituisce gli elementi con i metadati cancellati. Viene mantenuto solo itemspec.
HasMetadata @(MyItems->HasMetadata("MetadataName")) Restituisce gli elementi con il nome dei metadati specificato. Nel confronto non viene fatta distinzione tra maiuscole e minuscole.
Metadata @(MyItems->Metadata("MetadataName")) Restituisce i valori dei metadati con il nome dei metadati specificato. Gli elementi restituiti hanno gli stessi metadati dei valori di origine.
WithMetadataValue @(MyItems->WithMetadataValue("MetadataName", "MetadataValue")) Restituisce gli elementi con il nome e il valore dei metadati specificati. Nel confronto non viene fatta distinzione tra maiuscole e minuscole.

Nota

Existspuò essere usato anche in altri contesti; nelle condizioni di MSBuild, ad esempio ; o in Funzioni delle proprietà statiche, ad esempio Condition="Exists('path')"$([System.IO.File]::Exists("path")).

Nell'esempio seguente viene illustrato come usare le funzioni intrinseche degli elementi.

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

Rilevamento di duplicati quando si usa la funzione Elemento metadati

La Metadata funzione item mantiene i metadati originali degli elementi di origine. Ciò ha alcune implicazioni quando si valuta se gli elementi restituiti sono duplicati o meno. Per controllare la modalità di gestione degli elementi duplicati, è possibile usare l'attributo KeepDuplicates. È anche possibile rimuovere i metadati, se non è necessario, aggiungendo RemoveMetadata, nel qual caso vengono considerati solo i valori stessi durante il rilevamento di duplicati.

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

L'output è il seguente:

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

La modifica seguente al codice comporta il rilevamento e la rimozione del valore dell'elemento duplicato:

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

Funzioni di condizione DI MSBuild

La funzione non è una funzione HasTrailingSlash item. È disponibile per l'uso con l'attributo Condition . Vedere Condizioni di MSBuild.

È anche possibile usare gli attributi per eseguire operazioni sugli elenchi di elementi, ad esempio filtrare i metadati degli elementi. Per altre informazioni, vedere Elementi.