2012-08-31 7 views
17

Come si filtra un Gruppo articoli esistente in base a una condizione specifica, come l'estensione del file oi metadati dell'oggetto?Filtra un gruppo articoli esistente in modo che includa solo file che corrispondono ad alcune condizioni

Per questo esempio, utilizzerò l'estensione del file. Sto provando a filtrare il gruppo di elementi "Nessuno" definito da VS in modo che il mio obiettivo possa operare su tutti i file di una determinata estensione.

Per esempio, possono essere definiti i seguenti:

<ItemGroup> 
    <None Include="..\file1.ext" /> 
    <None Include="..\file2.ext" /> 
    <None Include="..\file.ext2" /> 
    <None Include="..\file.ext3" /> 
    <None Include="..\file.ext4" /> 
</ItemGroup> 

voglio filtrata del 'None' ItemGroup sopra in modo che includa solo l'estensione ext. Nota che faccio non voglio specificare tutte le estensioni da escludere, poiché variano a seconda del progetto e sto cercando di rendere il mio obiettivo riutilizzabile senza modifiche.

Ho provato ad aggiungere un Condition all'interno di un obiettivo:

<Target Name="Test"> 
    <ItemGroup> 
     <Filtered 
      Include="@(None)" 
      Condition="'%(Extension)' == 'ext'" 
      /> 
    </ItemGroup> 
    <Message Text="None: '%(None.Identity)'"/> 
    <Message Text="Filtered: '%(Filtered.Identity)'"/> 
</Target> 

Ma, purtroppo, non funziona. Ottengo i seguenti per l'uscita:

Test: 
    None: '..\file1.ext' 
    None: '..\file2.ext' 
    None: '..\file.ext2' 
    None: '..\file.ext3' 
    None: '..\file.ext4' 
    Filtered: '' 
+1

credo% (estensione) ha bisogno di essere '.ext' –

+0

'% (Estensione)' deve essere espanso all'estensione dell'elemento in '@ (Nessuno)' viene esaminato che è ciò che voglio comparato a 'ext', l'estensione di destinazione. –

+0

Voglio dire che ha letteralmente bisogno di essere ".ext", come in un punto come primo carattere, funziona bene allora. –

risposta

28
<ItemGroup> 
    <Filtered Include="@(None)" Condition="'%(Extension)' == '.ext'" /> 
</ItemGroup> 
+1

Hai ragione. L'estensione include il ".". –

+2

Questo non funziona per me. 'errore MSB4190: il riferimento ai metadati incorporati" Estensione "in posi zione 1 non è consentito in questa condizione" '% (Estensione)' == '.ext' ".' –

+4

Sembra funzionare quando all'interno ' ' –

1

Per il filtraggio avanzato Io suggerisco di usare il RegexMatch da MSBuild Community Tasks.

In questo esempio Filtro per Versionnumbers

<RegexMatch Input="@(Items)" Expression="\d+\.\d+\.\d+.\d+"> 
     <Output ItemName ="ItemsContainingVersion" TaskParameter="Output" /> 
    </RegexMatch> 

Procedure dell'installazione MSBuild comunitari attraverso Nuget: PM> Installa-Package MSBuildTasks o scaricarlo here

quindi importarlo nel vostro MSBuild script:

<PropertyGroup> 
    <MSBuildCommunityTasksPath>..\.build\</MSBuildCommunityTasksPath> 
</PropertyGroup> 
<Import Project="$(MSBuildCommunityTasksPath)MsBuild.Community.Tasks.Targets" /> 
Problemi correlati