使用msbuild复制所有文件和文件夹

只是想知道如果有人可以帮我一些我试图写的msbuild脚本。 我想要做的是将所有文件和子文件夹从一个文件夹复制到另一个文件夹使用msbuild。

{ProjectName} |----->Source |----->Tools |----->Viewer |-----{about 5 sub dirs} 

我需要做的是将所有文件和子文件夹从工具文件夹复制到应用程序的debugging文件夹中。 这是迄今为止的代码。

  <ItemGroup> <Viewer Include="..\$(ApplicationDirectory)\Tools\viewer\**\*.*" /> </ItemGroup> <Target Name="BeforeBuild"> <Copy SourceFiles="@(Viewer)" DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" /> </Target> 

生成脚本运行但不复制任何文件或文件夹。

谢谢

我也在寻求帮助。 我花了一段时间,但这是我做得很好的工作。

 <Target Name="AfterBuild"> <ItemGroup> <ANTLR Include="..\Data\antlrcs\**\*.*" /> </ItemGroup> <Copy SourceFiles="@(ANTLR)" DestinationFolder="$(TargetDir)\%(RecursiveDir)" SkipUnchangedFiles="true" /> </Target> 

这recursion地将名为antlrcs的文件夹的内容复制到$(TargetDir)

我认为问题可能在于如何创build您的ItemGroup并调用复制任务。 看看这是否有道理:

 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> <PropertyGroup> <YourDestinationDirectory>..\SomeDestinationDirectory</YourDestinationDirectory> <YourSourceDirectory>..\SomeSourceDirectory</YourSourceDirectory> </PropertyGroup> <Target Name="BeforeBuild"> <CreateItem Include="$(YourSourceDirectory)\**\*.*"> <Output TaskParameter="Include" ItemName="YourFilesToCopy" /> </CreateItem> <Copy SourceFiles="@(YourFilesToCopy)" DestinationFiles="@(YourFilesToCopy->'$(YourDestinationDirectory)\%(RecursiveDir)%(Filename)%(Extension)')" /> </Target> </Project> 

我有点新MSBuild,但我发现这样的情况下EXEC任务。 我在我的项目中遇到了同样的挑战,这对我很有帮助,而且简单得多。 有人请让我知道,如果这不是一个好的做法。

 <Target Name="CopyToDeployFolder" DependsOnTargets="CompileWebSite"> <Exec Command="xcopy.exe $(OutputDirectory) $(DeploymentDirectory) /e" WorkingDirectory="C:\Windows\" /> </Target> 
 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> <PropertyGroup> <YourDestinationDirectory>..\SomeDestinationDirectory</YourDestinationDirectory> <YourSourceDirectory>..\SomeSourceDirectory</YourSourceDirectory> </PropertyGroup> <Target Name="BeforeBuild"> <CreateItem Include="$(YourSourceDirectory)\**\*.*"> <Output TaskParameter="Include" ItemName="YourFilesToCopy" /> </CreateItem> <Copy SourceFiles="@(YourFilesToCopy)" DestinationFiles="$(YourFilesToCopy)\%(RecursiveDir)" /> </Target> </Project> 

\**\*.*帮助从所有文件夹中获取文件。 RecursiveDir帮助把所有的文件在相应的文件夹中…

你尝试指定具体的目的地目录,而不是

 DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" ? 

我不熟悉先进的MSBuild语法,但是

 @(Viewer->'$(OutputPath)\\Tools') 

看起来很奇怪。 脚本看起来不错,所以问题可能在于$(ApplicationDirectory)$(OutputPath)

编辑:

这是一篇可能有用的博客文章:

如何:使用任务recursion复制文件

这是工作的例子:

 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <MySourceFiles Include="c:\MySourceTree\**\*.*"/> </ItemGroup> <Target Name="CopyFiles"> <Copy SourceFiles="@(MySourceFiles)" DestinationFiles="@(MySourceFiles->'c:\MyDestinationTree\%(RecursiveDir)%(Filename)%(Extension)')" /> </Target> </Project> 

来源: https : //msdn.microsoft.com/en-us/library/3e54c37h.aspx

我个人使用了SDC任务库的CopyFolder。

http://sdctasks.codeplex.com/

这是我在自己的项目中使用的复制任务,它完美地工作,成功地将文件夹与子文件夹复制到目标:

 <ItemGroup > <MyProjectSource Include="$(OutputRoot)/MySource/**/*.*" /> </ItemGroup> <Target Name="AfterCopy" AfterTargets="WebPublish"> <Copy SourceFiles="@(MyProjectSource)" OverwriteReadOnlyFiles="true" DestinationFolder="$(PublishFolder)api/% (RecursiveDir)"/> 

在我的情况下,我复制项目的发布文件夹到另一个目标文件夹,我认为这是类似于你的情况。

    Interesting Posts