C# 带通配符的编程MSBuild递归副本
我正在创建一个MSBuild v4任务,该任务恰好需要调用复制任务以递归地复制一些文件(而不会在目标位置展平目录结构) 我提出了:C# 带通配符的编程MSBuild递归副本,c#,msbuild,C#,Msbuild,我正在创建一个MSBuild v4任务,该任务恰好需要调用复制任务以递归地复制一些文件(而不会在目标位置展平目录结构) 我提出了: var copy = new Microsoft.Build.Tasks.Copy { BuildEngine = this.BuildEngine, SourceFiles = new ITaskItem[] { new TaskItem(@"C:\source\**\*.foo") }, DestinationFolder = new T
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();
但我收到一个错误“无法将C:\source\***.foo复制到C:\dest\*-路径中的非法字符”
似乎没有太多关于实用调用的在线帮助,并且已经画出了空白。有什么想法吗
谢谢
Jon只需使用MSBuild复制任务即可完成。您不必为此编写新任务
<Copy SourceFiles="@(SourceFiles)"
DestinationFiles="$(DestinationFolder)\%(RecursiveDir)%(Filename)%(Extension)"
ContinueOnError="false"/>
选中所有可用项。问题是,在用XML编写相同的内容时,您不会将带有通配符的路径直接传递到
源文件
属性。您可以创建一个项目组,然后将其传递给任务
据我所知,正是ItemGroup
发挥了通配符的魔力,因此在C#中,您可以手动创建ITaskItem
数组,其中包含要复制的项目的完整列表
如果可以,创建一个传递给任务的ItemGroup
,然后将其传递给Copy
看起来复制任务对递归没有内在的理解;以下代码将导致复制任务在每个文件级别调用一次,这由MSBuild运行程序处理
<ItemGroup>
<x Include="c:\source\**\*.foo" />
</ItemGroup>
<Copy SourceFiles="@(x)" DestinationFolder="c:\dest\%(RecursiveDir)" />
但是,由于复制任务似乎将SourceFiles和DestinationFile视为关联数组(每种类型为ITaskItem[]),因此我们只是执行了递归下降并手动构建了这两个数组,然后再执行它如果这样做有效,我想它会压平您的文件夹结构。这是您想要的吗?否,我希望c:\source\a\b\c.foo复制到c:\dest\a\b\c.foo-谢谢,我会更新问题如果你删除c:\dest\中的双\\是否会有帮助?双dest是解析的%(RecursiveDir)值,正如复制任务所示,尽管我使用了大量的斜杠排列我们正在创建自己的c#任务,并希望利用其中的副本。看起来这似乎是不可能的,但由于安全限制,我无法在接下来的5个小时内发布我自己问题的答案。是ItemGroup(或至少MSBuild)进行了扩展,这会导致每个目录调用一次复制任务