使用通配符的程序化MSBuild递归复制

Jon*_*tes 4 c# msbuild

我正在创建一个MSBuild v4任务,恰好需要调用Copy任务来递归复制一些文件(不会在目的地展平目录结构).

我想出了:

var copy = new Microsoft.Build.Tasks.Copy
{
    BuildEngine = this.BuildEngine,
    SourceFiles = new ITaskItem[] { new TaskItem(@"C:\source\**\*.foo") },
    DestinationFolder = new TaskItem(@"c:\dest\\")
};
copy.Execute();
Run Code Online (Sandbox Code Playgroud)

但是收到错误'无法将C:\ source\**\*.foo复制到c:\ dest\* - 路径中的非法字符'

对于务实的调用似乎没有太多的在线帮助,并且已经画了一个空白.有任何想法吗?

谢谢

乔恩

Jon*_*tes 12

看起来Copy任务对递归没有内在的理解; 以下代码将导致每个文件级别调用一次Copy任务,这由MSBuild运行器处理.

<ItemGroup>
  <x Include="c:\source\**\*.foo" />
</ItemGroup>
<Copy SourceFiles="@(x)" DestinationFolder="c:\dest\%(RecursiveDir)" />
Run Code Online (Sandbox Code Playgroud)

但是,由于Copy任务似乎将SourceFiles和DestinationFiles视为关联数组(每个类型ITaskItem []),我们只是执行递归下降并在执行之前手动构建这两个数组