MSBuild - 如何复制可能存在或不存在的文件?

30

我有一个情况,需要在MSBuild脚本中复制一些特定文件,但是这些文件可能存在也可能不存在。如果它们不存在,那么没关系,我就不需要它们了。但是标准的<copy>任务如果在列表中找不到每个项目,则会报错...

3个回答

58

在复制任务中使用Exists条件。

<CreateItem Include="*.xml">
  <Output ItemName="ItemsThatNeedToBeCopied" TaskParameter="Include"/>
</CreateItem>

<Copy SourceFiles="@(ItemsThatNeedToBeCopied)"
      DestinationFolder="$(OutputDir)"
      Condition="Exists('%(RootDir)%(Directory)%(Filename)%(Extension)')"/>

1
谢谢!我忘记了这些! :) - Vilx-
9
еҖјеҫ—дёҖжҸҗзҡ„жҳҜпјҢеҸҜд»ҘзӣҙжҺҘдҪҝз”Ё%(FullPath)д»Јжӣҝ%(RootDir)%(Directory)%(Filename)%(Extension)пјҲиҜ·еҸӮи§Ғhttp://msdn.microsoft.com/en-us/library/ms171476.aspxпјүгҖӮ - AASoft
请注意,当您在提供“SourceFiles”时使用“transform”时,需要在“Condition”中提供完全相同的“transform”。 - patryk

9

最简单的方法是使用 ContinueOnError 标志 http://msdn.microsoft.com/zh-cn/library/7z253716.aspx

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
        <MySourceFiles Include="a.cs;b.cs;c.cs"/>
    </ItemGroup>

    <Target Name="CopyFiles">
        <Copy
            SourceFiles="@(MySourceFiles)"
            DestinationFolder="c:\MyProject\Destination"
            ContinueOnError="true"
        />
    </Target>

</Project>

但是如果还有其他问题,你就不会注意到它。因此,madgnome的回答中提到的条件会更好。


1

看起来您可以将MySourceFiles标记为SkipUnchangedFiles =“true”,如果文件已经存在,则不会复制文件。


只有当文件大小和修改日期相同时,它才不会复制文件,否则文件仍将被覆盖。 - Grengas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接