【问题标题】:Creating a list of Folders in an ItemGroup using MSBuild使用 MSBuild 在 ItemGroup 中创建文件夹列表
【发布时间】:2010-12-12 01:49:56
【问题描述】:

我正在尝试在 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”。

层次结构中的任何一点都可能有许多文件,但我只对文件夹感兴趣。

谁能帮忙!?

【问题讨论】:

    标签: msbuild


    【解决方案1】:
    <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>
    

    【讨论】:

    • 这真的很慢。如果可能,请使用@Stason Stangroome 提供的解决方案
    【解决方案2】:

    This MSDN Forum post 有一个处理空目录情况的自定义任务(被赞成作为一个有用的答案)

    【讨论】:

      【解决方案3】:

      MSBuild Extension pack 有一个名为FindUnder 的任务,它返回某个路径下的文件或文件夹的项目组。以下任务将实现您想要的,返回包含子文件夹 1、子文件夹 2 和子文件夹 3,但不包含子子文件夹 1 或子子文件夹 2 的项目组:

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

      【讨论】:

        【解决方案4】:

        在 MSBuild 4.0 中这是可能的:

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

        属性函数:http://msdn.microsoft.com/en-us/library/dd633440.aspx

        【讨论】:

        • 谢谢!就我而言,我还添加了搜索模式:
        • 与其在尝试阅读声明时让我头疼的丑陋 &amp;quot; 实体相比,您也可以简单地使用反引号 (`)。
        【解决方案5】:

        MSBuild 4.0:

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

        【讨论】:

        • 不选择空目录。
        • 如果子文件夹中有文件夹,这将选择子文件夹。所以可能有效,但不能保证只选择第一级子文件夹。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-12
        • 2018-09-19
        • 2011-10-07
        • 2018-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多