gpt4 book ai didi

msbuild - 获取 msbuild 中的子目录列表

转载 作者:行者123 更新时间:2023-12-04 03:10:11 25 4
gpt4 key购买 nike

给定一个目录列表:

<ItemGroup>
<Dirs Include="Foo\Dir1" />
<Dirs Include="Foo\Dir2" />
</ItemGroup>

如何获取所有子目录的列表。

使用 "$(Identity)\**" 转换此列表不匹配任何内容并使用 "$(Identity)\**\*" 转换,然后使用 RelativeDir 仅生成包含文件的目录。

目前我不得不求助于 C#:

<UsingTask TaskName="GetSubdirectories" TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<Directories ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
<SubDirectories ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true" />
</ParameterGroup>
<Task>
<Code Type="Fragment" Language="cs"><![CDATA[
var result = new List<ITaskItem>();
foreach (var dirItem in Directories) {
foreach (var dir in Directory.GetDirectories(dirItem.ItemSpec, "*", SearchOption.AllDirectories)) {
if (dir.Contains(@"\.svn\") || dir.EndsWith(@"\.svn")) continue;
result.Add(new TaskItem(dir));
}
}
SubDirectories = result.ToArray();
]]></Code>
</Task>
</UsingTask>

<GetSubdirectories Directories="@(Dirs)">
<Output TaskParameter="SubDirectories" ItemName="SubDirs" />
</GetSubdirectories>

但我想知道是否有更简单的方法。

最佳答案

摘自《MSBuild Trickery》一书:

<Import Project="EnableAllPropertyFunctions.tasks" />

<Target Name="GetSubdirectories">
<ItemGroup>
<Dirs Include="$([System.IO.Directory]::
EnumerateDirectories(
`.\Foo`,
`*`,
System.IO.SearchOption.AllDirectories))"
/>
</ItemGroup>

<Message Text="%(Dirs.Identity)" />
</Target>

您首先需要通过确保将环境变量 MSBuildEnableAllPropertyFunctions 设置为值 1(这是导入的 .tasks 文件通过内联任务完成的)来启用扩展属性功能集。

设置@(Dirs) 后,您可以使用 Remove 属性过滤它以删除 Subversion 文件夹。

关于msbuild - 获取 msbuild 中的子目录列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7269948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com