Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带通配符的编程MSBuild递归副本_C#_Msbuild - Fatal编程技术网

C# 带通配符的编程MSBuild递归副本

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

我正在创建一个MSBuild v4任务,该任务恰好需要调用复制任务以递归地复制一些文件(而不会在目标位置展平目录结构)

我提出了:

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)进行了扩展,这会导致每个目录调用一次复制任务