You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MSBuild批量删除文件夹时排除指定文件夹?

动态排除指定语言文件夹的MsBuild实现方案

问题背景

现有一个MsBuild.targets文件,可删除输出目录下除指定文件夹外的所有语言文件夹,原代码静态排除en-us和fa-IR文件夹。现在需要通过ExcludedLanguages属性实现动态配置排除列表,但尝试的代码无效,所有文件夹都被删除。

原静态排除代码:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="RemoveFolders" AfterTargets="Build">
    <ItemGroup>
      <RemovingFiles Include="$(OutDir)*\*.mui" Exclude="$(OutDir)en-us\*.mui;$(OutDir)fa-IR\*.mui" />
      <RemovingFolders Include="@(RemovingFiles->'%(RootDir)%(Directory)')" />
    </ItemGroup>
    <RemoveDir Directories="@(RemovingFolders)" />
  </Target>
</Project>

尝试的无效动态代码:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <!-- Comma-separated list of languages to exclude -->
    <ExcludedLanguages>en-US,fa-IR</ExcludedLanguages>
  </PropertyGroup>

  <Target Name="RemoveFolders" AfterTargets="Build">
    <ItemGroup>
      <RemovingFiles Include="$(OutDir)*\*.mui" Exclude="@(ExcludedLanguages->'%(Identity)')\*.mui" />
      <RemovingFolders Include="@(RemovingFiles->'%(RootDir)%(Directory)')" />
    </ItemGroup>
    <RemoveDir Directories="@(RemovingFolders)" />
  </Target>
</Project>

错误原因

  1. ExcludedLanguages是属性(PropertyGroup),不是项(ItemGroup),不能用@()语法直接引用,需先转换为项集合。
  2. 未拼接输出目录路径$(OutDir),导致排除路径无效,所有文件都被纳入删除范围。
  3. 属性多值建议用分号(MsBuild标准分隔符),而非逗号,避免解析异常。

正确实现方案

将属性转换为项集合,生成正确的排除路径,代码如下:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <!-- 用分号分隔要排除的语言列表 -->
    <ExcludedLanguages>en-US;fa-IR</ExcludedLanguages>
  </PropertyGroup>

  <Target Name="RemoveFolders" AfterTargets="Build">
    <!-- 将属性转换为项集合 -->
    <ItemGroup>
      <ExcludedLanguage Include="$(ExcludedLanguages.Split(';'))" />
      <!-- 生成每个语言对应的排除文件路径 -->
      <ExcludedFiles Include="@(ExcludedLanguage->'$(OutDir)%(Identity)\*.mui')" />
    </ItemGroup>

    <!-- 收集要删除的文件(排除指定语言的文件) -->
    <ItemGroup>
      <RemovingFiles Include="$(OutDir)*\*.mui" Exclude="@(ExcludedFiles)" />
      <!-- 提取要删除的文件夹路径 -->
      <RemovingFolders Include="@(RemovingFiles->'%(RootDir)%(Directory)')" />
      <!-- 去重,避免重复删除同一个文件夹 -->
      <RemovingFolders RemoveDuplicates="true" />
    </ItemGroup>

    <!-- 执行删除操作 -->
    <RemoveDir Directories="@(RemovingFolders)" />
  </Target>
</Project>

关键说明

  • $(ExcludedLanguages.Split(';')):将分号分隔的属性值拆分为项集合,每个语言作为单独的项。
  • @(ExcludedLanguage->'$(OutDir)%(Identity)\*.mui'):对每个语言项,拼接出完整的排除文件路径。
  • RemoveDuplicates="true":避免因同一个文件夹下有多个mui文件导致重复删除请求,提升执行效率。

内容的提问来源于stack exchange,提问作者Chibako

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:55:36