MSBuild-子目录中所有bin目录的ItemGroup

MSBuild-子目录中所有bin目录的ItemGroup,msbuild,itemgroup,Msbuild,Itemgroup,我的解决方案有多个项目(因此还有子目录),每个项目文件夹中都有一个“bin”文件夹 我正在尝试在MSBuild脚本中创建一个包含所有这些目录的项目组 我认为这就足够了,但它不包含任何内容: <ItemGroup> <BinDirs Include="**\bin" /> </ItemGroup> 我不知道为什么这不起作用。有人能给我指出正确的方向来实现我的目标吗 问候,, 尼克因为这还没有答案,所以在谷歌搜索结果列表中排名靠前: Alexey提供的链

我的解决方案有多个项目(因此还有子目录),每个项目文件夹中都有一个“bin”文件夹

我正在尝试在MSBuild脚本中创建一个包含所有这些目录的项目组

我认为这就足够了,但它不包含任何内容:

<ItemGroup>
  <BinDirs Include="**\bin" />
</ItemGroup>

我不知道为什么这不起作用。有人能给我指出正确的方向来实现我的目标吗

问候,,
尼克

因为这还没有答案,所以在谷歌搜索结果列表中排名靠前:

Alexey提供的链接有几个解决此问题的答案,但您给出的示例不起作用的原因并不明显

MSBuild ItemGroup集合在以目录为目标时似乎不喜欢通配符转换

您可以使用显式路径,例如

<ItemGroup>
  <BinDirs Include="C:\MyProject\bin" />
</ItemGroup>

或与生成脚本运行位置相关的路径,例如

<ItemGroup>
  <BinDirs Include="..\MyProject\bin" />
</ItemGroup>

但是,它不会转换通配符,除非您以文件为目标,例如

<ItemGroup>
  <ThisWorks Include="..\**\bin\*" />
  <ThisDoesnt Include="..\**\bin" />
</ItemGroup>

这篇文章包含几种使用通配符选择文件夹的方法,我倾向于使用以下方法:

<ItemGroup>
  <GetAllFiles Include="..\**\bin\*.*" />
  <GetFolders Include="@(GetAllFiles->'%(RootDir)%(Directory)'->Distinct())" />
</ItemGroup>

正如文章中提到的,它在选择根文件夹方面并不完美,因为它必须找到文件所在的位置。仅当文件位于bin文件夹中时,使用bin**才能获取该文件夹

如果您的构建类似于标准VS输出,您可能会发现您的bin文件夹没有文件,而是具有基于您的配置名称的目录,例如bin\Debug,在这种情况下,以bin\***为目标将导致您的项目组包含这些文件夹

例如


将得到:

  • ..\Proj1\bin\Debug
  • ..\Proj1\bin\Release
  • ..\Proj2\bin\Debug
  • ..\Proj2\bin\Release
我不知道一个通配符的方式来获取没有文件的bin文件夹。。。然而如果有人找到一个,请张贴,因为它将是有用的


希望这有助于节省时间。

在MSBuild 4.0中,这是可能的:

<Folders Include="$([System.IO.Directory]::GetDirectories(&quot;.&quot;,&quot;Bin&quot;, SearchOption.AllDirectories))" />

如果子文件夹为空,则检查此问题失败:(
<Folders Include="$([System.IO.Directory]::GetDirectories(&quot;.&quot;,&quot;Bin&quot;, SearchOption.AllDirectories))" />