2012-08-31 15 views
17

Varolan bir ItemGroup'ı dosya uzantısı veya öğenin meta verileri gibi belirli bir duruma göre nasıl filtrelersiniz?Varolan bir öğe grubunu filtreleyerek yalnızca bazı koşullarla eşleşen dosyaları içerir

Bu örnekte, dosya uzantısını kullanacağım. Hedefimin tüm bir uzantıdaki tüm dosyalar üzerinde çalışabilmesi için VS tarafından tanımlanan 'None' ItemGroup'u filtrelemeye çalışıyorum.

Örneğin, aşağıdaki şekilde tanımlanabilmektedir:

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

bunun sadece ext uzantısını içerir, böylece 'Hiçbiri' yukarıda ItemGroup filtre istiyoruz. numaralı'u hariç tuttuğum tüm uzantıları belirtmek istediğimi unutmayın, çünkü bunlar projeye göre değişecektir ve hedefimi değiştirmeden yeniden kullanılabilir hale getirmeye çalışıyorum.

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

Ama ne yazık ki, bu çalışmaz:

Bir hedef dahilindeki bir Condition ekleyerek denedim. Ben çıkış için aşağıdaki olsun: gelişmiş filtreleme için

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

% (Uzantı) '.ext' olması gerektiğine inanıyorum –

+0

'% (Extension)', '@ (None) 'içindeki öğenin uzantısına genişletilmeli ve hedef uzantı olan' ext 'ile karşılaştırmak istediğim şeydir. –

+0

Yani kelimenin tam anlamıyla ilk char olarak bir nokta ile olduğu gibi '.ext' olması gerekiyor, o zaman iyi çalışıyor. –

cevap

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

Haklısınız. Uzantı '.' Içerir. –

+2

Bu benim için çalışmıyor. 'hata MSB4190: numaralı yordam 1'deki yerleşik" metadata "eklentisine yapılan başvuruya bu durumda izin verilmez" '% (Uzantı)' == '.ext' ".' –

+4

İçinde çalışırken gözüküyor ' –

1

ben MSBuild Community Tasks den RegexMatch kullanmanızı öneririz. Bu Örnekte

biz Versionnumbers için filtre edecek

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

Nuget aracılığıyla MSBuild Topluluk Görevler yükleyin: PM> MSBuildTasks-Paketi yükleme veya Sonra here

indirebilir MSBuild bunu aktarın Komut dosyası:

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