2012-08-31 24 views
17

Làm cách nào để lọc một Nhóm mục hiện có dựa trên một điều kiện cụ thể, chẳng hạn như phần mở rộng tệp hoặc siêu dữ liệu của mục?Lọc một nhóm mục hiện có để nó chỉ bao gồm các tệp phù hợp với một số điều kiện

Ví dụ này, tôi sẽ sử dụng đuôi tệp. Tôi đang cố gắng để lọc 'Không có' ItemGroup được xác định bởi VS để mục tiêu của tôi có thể hoạt động trên tất cả các tập tin của một phần mở rộng nhất định.

Ví dụ, sau đây có thể được định nghĩa:

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

Tôi muốn lọc các 'Không' ItemGroup trên vì vậy nó chỉ bao gồm phần mở rộng ext. Lưu ý rằng tôi làm không phải muốn chỉ định tất cả các tiện ích mở rộng cần loại trừ vì chúng sẽ thay đổi theo từng dự án và tôi đang cố gắng làm cho mục tiêu của tôi có thể sử dụng lại mà không sửa đổi.

Tôi đã thử thêm một Condition trong một mục tiêu:

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

Nhưng thật đáng buồn, nó không hoạt động. Tôi nhận được những điều sau đây cho kết quả:

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

Tôi tin rằng% (Tiện ích mở rộng) cần phải là '.ext' –

+0

'% (Extension)' nên được mở rộng đến phần mở rộng của mục trong '@ (None)' đang được kiểm tra, cái mà tôi muốn so với 'ext', phần mở rộng đích. –

+0

Tôi có nghĩa là nó cần phải được '.ext', như trong với một dấu chấm như char đầu tiên, hoạt động tốt sau đó. –

Trả lời

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

Bạn nói đúng. Phần mở rộng bao gồm '.'. –

+2

Điều này không hiệu quả đối với tôi. 'lỗi MSB4190: Tham chiếu đến siêu dữ liệu" Mở rộng "tích hợp tại posi tion 1 không được phép trong điều kiện này" '% (Extension)' == '.ext' ".' –

+4

Dường như hoạt động khi bên trong ' ' –

1

Để lọc tiên tiến tôi đề nghị sử dụng các RegexMatch từ MSBuild Community Tasks.

Trong ví dụ này, chúng ta sẽ lọc cho Versionnumbers

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

Install MSBuild Nhiệm vụ cộng đồng qua NuGet: PM> Install-Package MSBuildTasks hoặc tải nó here

sau đó nhập nó trong MSBuild của bạn Tập lệnh:

<PropertyGroup> 
    <MSBuildCommunityTasksPath>..\.build\</MSBuildCommunityTasksPath> 
</PropertyGroup> 
<Import Project="$(MSBuildCommunityTasksPath)MsBuild.Community.Tasks.Targets" /> 
Các vấn đề liên quan