12

我目前正在使用 msbuild 文件在编译我的 EXE 时将一些文件复制到公共文档文件夹。我当前的脚本包括:

<Target Name="DeployToPublicDocuments"
              Inputs="@(DeploymentItems)"
              Outputs="$(PublicDocumentsFolder)%(Path)\%(DeploymentItems.RecursiveDir)%(DeploymentItems.Filename)%(DeploymentItems.Extension)">
        <Copy SourceFiles="%(DeploymentItems.FullPath)"
            DestinationFiles="$(PublicDocumentsFolder)%(Path)\%(DeploymentItems.RecursiveDir)%(DeploymentItems.Filename)%(DeploymentItems.Extension)"
                Condition="!Exists('$(PublicDocumentsFolder)%(Path)\%(DeploymentItems.RecursiveDir)%(DeploymentItems.Filename)%(DeploymentItems.Extension)')" />

此代码仅在目标不存在时复制。但是,如果我的来源较新,我想替换目的地。如何修改我的脚本以实现这一目标?我看到了 SkipUnchangedFiles 标志,但它还会比较文件大小以确定是否应覆盖目标。那不是我想要的。

4

2 回答 2

18

您的副本的条件可以更改如下:

    <Copy SourceFiles="%(DeploymentItems.FullPath)"
        DestinationFiles="$(PublicDocumentsFolder)%(Path)\%(RecursiveDir)%(Filename)%(DeploymentItems.Extension)"
            Condition="%(Filename)!='' AND (!Exists('$(PublicDocumentsFolder)%(Path)\%(RecursiveDir)%(Filename)%(DeploymentItems.Extension)') OR $([System.DateTime]::Parse('%(ModifiedTime)').Ticks) &gt; $([System.IO.File]::GetLastWriteTime('$(PublicDocumentsFolder)%(Path)\%(RecursiveDir)%(Filename)%(DeploymentItems.Extension)').Ticks))" />

%(ModifiedTime)=修改源文件的日期时间

$([System.IO.File]::GetLastWriteTime($(PublicDocumentsFolder)%(Path)\%(RecursiveDir)%(Filename)%(DeploymentItems.Extension)))= 目标文件的修改日期时间(如果存在)

让我知道这是否有效,没有测试。

于 2013-11-04T18:28:01.100 回答
8

我认为您可能误读了文档:

跳过未更改的文件

如果为 true,则跳过源和目标之间未更改的文件的复制。如果文件具有相同的大小和相同的最后修改时间,则Copy 任务认为文件未更改。

http://msdn.microsoft.com/en-us/library/vstudio/3e54c37h.aspx

于 2013-11-04T14:22:23.650 回答