2009-11-01 51 views
27

我試圖在MSBuild腳本中構建ItemGroup,該腳本包含直接位於給定「根」文件夾下方的文件夾列表。所以 - 在這個例子中...使用MSBuild創建ItemGroup中的文件夾列表

+ Root folder 
---- Sub Folder 1 
-------- Sub-Sub Folder 1 
-------- Sub-Sub Folder 2 
---- Sub Folder 2 
---- Sub Folder 3 

...我想我的ItemGroup含有「子文件夾1」,「子文件2」和「子文件3」。

層次結構中的任何位置都可能有多個文件,但我只對這些文件夾感興趣。

任何人都可以幫忙!?

回答

27
<PropertyGroup> 
    <RootFolder>tmp</RootFolder> 
</PropertyGroup> 
<ItemGroup> 
    <AllFiles Include="$(RootFolder)\**\*"/> 
    <OnlyDirs Include="@(AllFiles->'%(Directory)')"/> 
</ItemGroup> 

@(OnlyDirs)可能包含重複的,所以你既可以使用RemoveDuplicatesTask:

<Target Name="foo"> 
    <RemoveDuplicates Inputs="@(OnlyDirs)"> 
     <Output TaskParameter="Filtered" ItemName="UniqueDirs"/> 
    </RemoveDuplicates> 
</Target> 

或使用CreateItem與配料爲%(AllFiles.Identity)或MSBuild的3.5:

<Target Name="foo"> 
    <ItemGroup> 
     <UniqueDirs Include="%(AllFiles.Directory)"/> 
    </ItemGroup> 
</Target> 
+1

這真的很慢。如果可能,請使用@Stason Stangroome提供的解決方案 – LuckyLikey 2016-02-25 13:09:47

3

This MSDN Forum post有一個處理空目錄案例的自定義任務(upvote接受爲其有效答案)

6

MSBuild Extension pack有一個任務,稱爲FindUnder,它返回某個路徑下的文件或文件夾的項目組。下面的任務將實現你想要什麼,返回包含子文件夾1,子文件夾2,子文件夾3的的ItemGroup,但並非次次文件夾1或細分子文件夾2:

<MSBuild.ExtensionPack.FileSystem.FindUnder 
    TaskAction="FindDirectories" 
    Path="$(RootFolder)" 
    Recursive="False"> 
    <Output ItemName="FoundFolders" TaskParameter="FoundItems" /> 
</MSBuild.ExtensionPack.FileSystem.FindUnder> 
45

在的MSBuild 4.0這是可能的:

<ItemGroup> 
    <Folders Include="$([System.IO.Directory]::GetDirectories(&quot;$(RootFolder)&quot;))" /> 
</ItemGroup> 

屬性函數:http://msdn.microsoft.com/en-us/library/dd633440.aspx

+2

謝謝!在我的情況下,我增加了搜索模式,以及:\t \t <文件夾包括= 「$([System.IO.Directory] ​​:: GetDirectories(" $(RootFolder)"," * $(是searchPattern)* "))」 /> – Houman 2014-06-30 06:03:42

+3

而不是醜陋的'"'實體,當我試圖閱讀這個語句的時候讓我頭疼,你可以簡單地使用反引號('''')。 – MarioDS 2016-06-02 07:58:00

6

的MSBuild 4.0:

<PropertyGroup> 
    <RootFolder>tmp</RootFolder> 
</PropertyGroup> 
<ItemGroup> 
    <AllFiles Include="$(RootFolder)\**\*"/> 
    <OnlyDirs Include="@(AllFiles->'%(RootDir)%(Directory)'->Distinct())"/> 
</ItemGroup> 
+2

不選擇空目錄。 – Mrchief 2012-08-23 15:48:59

+0

這將選擇子子文件夾,如果他們有文件夾。所以可能會工作,但不能保證只選擇第一級子文件夾。 – htuomola 2013-05-17 07:14:19

相關問題