2012-08-31 5 views
17

आप एक विशिष्ट स्थिति के आधार पर एक मौजूदा ItemGroup फिल्टर कैसे करूं से मेल खाते हैं, भी शामिल है?फ़िल्टर एक मौजूदा itemgroup तो यह केवल इस तरह के फाइल एक्सटेंशन या आइटम के मेटाडेटा के रूप में फाइल है कि कुछ शर्त

इस उदाहरण के लिए, मैं फाइल एक्सटेंशन का उपयोग करेंगे। मैं वीएस द्वारा परिभाषित 'कोई नहीं' आइटम समूह फ़िल्टर करने की कोशिश कर रहा हूं ताकि मेरा लक्ष्य किसी दिए गए एक्सटेंशन की सभी फ़ाइलों पर काम कर सके।

उदाहरण के लिए, निम्नलिखित में परिभाषित किया जा सकता है:

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

मैं फिल्टर करने के लिए 'कोई नहीं' से ऊपर ItemGroup तो यह केवल ext एक्सटेंशन शामिल करना चाहते हैं। ध्यान दें कि मैं क्या के रूप में वे परियोजना के साथ बदलता जाएगा नहीं, सभी विस्तार बाहर करने के लिए निर्दिष्ट करना चाहते हैं और मैं अपने लक्ष्य संशोधन के बिना पुन: प्रयोज्य बनाने की कोशिश कर रहा हूँ।

मैं एक लक्ष्य के भीतर एक Condition जोड़ने की कोशिश की है:

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

लेकिन दुर्भाग्य से, यह काम नहीं करता। मैं उत्पादन के लिए निम्नलिखित हो:

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

मेरा मानना ​​है कि% (एक्सटेंशन) को '.ext' होना चाहिए –

+0

'% (एक्सटेंशन) 'को' @ (कोई नहीं) 'में आइटम के विस्तार में विस्तारित किया जाना चाहिए, जिसे मैं' एक्सटी ', लक्ष्य विस्तार से तुलना करना चाहता हूं। –

+0

मेरा मतलब है कि इसे सचमुच '.ext' होना चाहिए, जैसा कि पहले चार के रूप में एक बिंदु के साथ, ठीक है तो ठीक काम करता है। –

उत्तर

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

आप सही हैं। एक्सटेंशन में '।' शामिल है। –

+2

यह मेरे लिए काम नहीं करता है। 'त्रुटि MSB4190:। Posi tion 1 में निर्मित मेटाडाटा" विस्तार "के संदर्भ में इस हालत" '% (एक्सटेंशन)' == '.ext' "में अनुमति नहीं है' –

+4

काम करने के लिए लगता है जब अंदर ' ' –

1

उन्नत फ़िल्टरिंग के लिए मैं MSBuild Community Tasks से RegexMatch उपयोग करने का सुझाव।

इस उदाहरण में हम Versionnumbers के लिए फिल्टर होगा

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

Nuget के माध्यम से MSBuild सामुदायिक कार्य स्थापित करें: PM> इंस्टॉल करें-पैकेज MSBuildTasks या डाउनलोड यह here

फिर अपने MSBuild में यह आयात करें स्क्रिप्ट:

<PropertyGroup> 
    <MSBuildCommunityTasksPath>..\.build\</MSBuildCommunityTasksPath> 
</PropertyGroup> 
<Import Project="$(MSBuildCommunityTasksPath)MsBuild.Community.Tasks.Targets" /> 
संबंधित मुद्दे