28

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

4

3 回答 3

50

对复制任务使用存在条件。

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

<Copy SourceFiles="@(ItemsThatNeedToBeCopied)"
      DestinationFolder="$(OutputDir)"
      Condition="Exists('%(RootDir)%(Directory)%(Filename)%(Extension)')"/>
于 2009-02-04T15:38:50.137 回答
7

最简单的方法是使用 ContinueOnError 标志http://msdn.microsoft.com/en-us/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 的答案存在的条件会更好。

于 2009-02-04T15:50:29.397 回答
0

看起来您可以将 MySourceFiles 标记为 SkipUnchangedFiles="true" 并且如果文件已经存在,它将不会复制它们。

于 2009-08-25T16:53:42.100 回答