103

只是想知道是否有人可以帮助我编写一些我正在尝试编写的 msbuild 脚本。我想做的是使用 msbuild 将所有文件和子文件夹从一个文件夹复制到另一个文件夹。

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

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

<ItemGroup>
    <Viewer Include="..\$(ApplicationDirectory)\Tools\viewer\**\*.*" />
</ItemGroup>

<Target Name="BeforeBuild">
    <Copy SourceFiles="@(Viewer)" DestinationFolder="@(Viewer->'$(OutputPath)\\Tools')" />
</Target>

构建脚本运行但不复制任何文件或文件夹。

谢谢

4

10 回答 10

151

我也在寻找这方面的帮助。我花了一段时间,但这是我所做的,效果非常好。

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

这递归地将名为的文件夹的内容复制antlrcs$(TargetDir).

于 2013-03-30T16:06:46.813 回答
73

I think the problem might be in how you're creating your ItemGroup and calling the Copy task. See if this makes sense:

<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>
于 2008-09-23T12:35:42.007 回答
36

我对 MSBuild 有点陌生,但我发现 EXEC 任务在这种情况下很方便。我在我的项目中遇到了同样的挑战,这对我有用,而且要简单得多。如果这不是一个好习惯,请告诉我。

<Target Name="CopyToDeployFolder" DependsOnTargets="CompileWebSite">
    <Exec Command="xcopy.exe  $(OutputDirectory) $(DeploymentDirectory) /e" WorkingDirectory="C:\Windows\" />
</Target>
于 2010-01-03T01:05:57.440 回答
14
<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 帮助将所有文件放在相应的文件夹中...

于 2012-10-30T09:33:27.503 回答
4

您是否尝试指定具体的目标目录而不是

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

我对高级 MSBuild 语法不是很精通,但是

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

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

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

如何:使用 <Copy> 任务递归复制文件

于 2008-09-23T05:33:50.353 回答
4

这是有效的示例:

<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

于 2015-10-29T06:39:49.400 回答
3

这是我在自己的项目中使用的复制任务,它对我来说非常有效,可以将带有子文件夹的文件夹成功复制到目的地:

<ItemGroup >
<MyProjectSource Include="$(OutputRoot)/MySource/**/*.*" />
</ItemGroup>

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

就我而言,我将项目的发布文件夹复制到另一个目标文件夹,我认为这与您的情况类似。

于 2016-10-20T14:28:56.787 回答
1

我个人使用了 CopyFolder,它是 SDC 任务库的一部分。

http://sdctasks.codeplex.com/

于 2010-04-26T14:28:12.870 回答
0

如果您使用的是典型的 C++ 工具链,另一种方法是将文件添加到标准 CopyFileToFolders 列表中

<ItemGroup>
  <CopyFileToFolders Include="materials\**\*">
    <DestinationFolders>$(MainOutputDirectory)\Resources\materials\%(RecursiveDir)</DestinationFolders>
  </CopyFileToFolders>
</ItemGroup>

除了简单之外,这是一个不错的方法,因为 CopyFilesToFolders 任务将生成适当的输入、输出甚至TLog 文件,因此确保复制操作仅在输入文件之一发生更改或输出文件之一丢失时运行。使用 TLog,Visual Studio 还将正确地将项目识别为“最新”或不是(它为此使用单独的 U2DCheck 机制)。

于 2019-09-27T17:17:08.367 回答
0

使用 MSBuild 将文件从一个目录递归复制到另一个目录的最佳方法是使用带有 SourceFiles 和 DestinationFiles 作为参数的 Copy 任务。例如 - 将所有文件从构建目录复制到备份目录将是

<PropertyGroup>
<BuildDirectory Condition="'$(BuildDirectory)' == ''">Build</BuildDirectory>
<BackupDirectory Condition="'$(BackupDiretory)' == ''">Backup</BackupDirectory>
</PropertyGroup>

<ItemGroup>
<AllFiles Include="$(MSBuildProjectDirectory)/$(BuildDirectory)/**/*.*" />
</ItemGroup>

<Target Name="Backup">
<Exec Command="if not exist $(BackupDirectory) md $(BackupDirectory)" />
<Copy SourceFiles="@(AllFiles)" DestinationFiles="@(AllFiles-> 
'$(MSBuildProjectDirectory)/$(BackupDirectory)/%(RecursiveDir)/%(Filename)% 
(Extension)')" />
</Target>

现在在上面的 Copy 命令中,遍历所有源目录并将文件复制到目标目录。

于 2019-04-28T05:24:22.373 回答