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

基于MSBuild实现按子目录执行CLI工具生成对应输出文件

MSBuild Project to Run MyTool.exe on Each Subdirectory's Files

这里有一个完整的MSBuild项目文件,正好满足你的需求——针对每个子目录批量运行MyTool.exe,并且为每个子目录生成对应的输出文件。你可以直接套用,或者根据实际目录结构、文件类型调整细节:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- 基础配置:定义主目录和MyTool路径 -->
  <PropertyGroup>
    <!-- 主目录路径,相对项目文件的位置,可按需修改 -->
    <MainDir>$(MSBuildProjectDirectory)\MainDir</MainDir>
    <!-- MyTool.exe的完整路径,如果在PATH里可以直接写MyTool.exe -->
    <MyToolPath>$(MSBuildProjectDirectory)\MyTool.exe</MyToolPath>
  </PropertyGroup>

  <!-- 收集MainDir下所有目标子目录 -->
  <ItemGroup>
    <!-- 如果你子目录不是SubDir开头,把SubDir*改成*即可收集所有子目录 -->
    <SubDirs Include="$(MainDir)\SubDir*" />
  </ItemGroup>

  <!-- 核心目标:逐个处理每个子目录 -->
  <Target Name="ProcessAllSubDirs" Outputs="%(SubDirs.Identity)\output.txt">
    <!-- 收集当前子目录下的所有文本文件 -->
    <ItemGroup>
      <!-- 可修改通配符适配你的文件类型,比如*.md或*.* -->
      <InputFiles Include="%(SubDirs.Identity)\*.txt" />
    </ItemGroup>

    <!-- 定义当前子目录的输出文件路径 -->
    <PropertyGroup>
      <!-- 输出文件名包含子目录名称,避免重名,比如SubDir1的输出是output_SubDir1.txt -->
      <OutputFile>%(SubDirs.Identity)\output_%(SubDirs.Filename).txt</OutputFile>
    </PropertyGroup>

    <!-- 执行MyTool命令,用转义引号处理带空格的路径 -->
    <Exec Command="&quot;$(MyToolPath)&quot; @(InputFiles) -o &quot;$(OutputFile)&quot;" />
  </Target>

  <!-- 默认目标:运行所有子目录的处理任务 -->
  <Target Name="Default" DependsOnTargets="ProcessAllSubDirs" />
</Project>

关键部分解释:

  • PropertyGroup:这里配置了两个核心路径,$(MSBuildProjectDirectory)是MSBuild内置变量,代表项目文件所在的目录,用它来定义相对路径会更灵活,避免硬编码绝对路径。
  • SubDirs ItemGroup:用通配符收集所有目标子目录,如果你想处理MainDir下的所有子目录,直接把SubDir*改成*就行。
  • ProcessAllSubDirs Target:
    • Outputs属性实现了增量构建——MSBuild会检查输出文件的时间戳,如果子目录里的输入文件没有更新,就不会重复执行MyTool,节省构建时间。
    • %(SubDirs.Identity)是MSBuild的元数据,代表当前迭代的子目录完整路径,这样我们就能逐个处理每个子目录。
    • @(InputFiles)会自动把收集到的所有输入文件用空格分隔,完美适配MyTool的多输入参数格式。
    • 输出文件名里加入了%(SubDirs.Filename)(子目录的名称),确保每个子目录的输出文件不会互相覆盖。

注意事项:

  • 如果你的MyTool需要处理非txt文件,修改<InputFiles>里的通配符即可,比如*.log或者*.*。
  • 如果MyTool已经在系统PATH环境变量中,可以直接把MyToolPath改成MyTool.exe,不用写全路径。
  • 如果子目录的命名规则特殊,调整SubDirs的Include通配符来匹配你的目录结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:31:06