【问题标题】:copying list of delimited files using MSBuild使用 MSBuild 复制分隔文件列表
【发布时间】:2011-04-26 09:08:03
【问题描述】:

我在properygroup中有字符串值,它是从config.xml文件中读取的,输出为“c:\test\file1;c:\test2\file2”我需要使用MSBuild将该列表复制到目标文件夹我怎么能做到了吗?

<Target Name="CopyFiles">  
    <ItemGroup>
        <FilesToCopy 
            Include="@(filesToCopy)"                 
            Exclude="**\*trash*"/>
    </ItemGroup>
    <Copy SourceFiles="@(filesToCopy)"          
         DestinationFiles="@(filesToCopy->'$(Dest)\%(RecursiveDir)\%(Filename)%(Extension)')"          
         ContinueOnError="true"/></Target>

在上面的代码中,@filesToCopy 包含逗号分隔的文件列表。

【问题讨论】:

  • 您注意到语法错误了吗?上面的代码"Include="@filesToCopy"" 应该是"Include="@(filesToCopy)""
  • 是的,复制时出错了仍然没有找到解决办法
  • @DSharper:自 2011 年以来有任何更新吗?

标签: .net asp.net msbuild


【解决方案1】:

您不应该关心分号作为分隔符。在这种情况下,MSBuild 的复制任务可以正常工作。

它显示在 MSDN 文档示例中:

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

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

来自 MSDN Copy 任务的explanation

【讨论】:

  • @anton-k,它抱怨将所有文件复制为一个文件名(即“a.cs;b.cs;c.cs”都作为文件名)不起作用
  • @anton-k,如果 inlude 包含硬编码的文件名,则您的代码可以工作,但请参阅我的代码上方,我希望 Include="@(FilestoCopy)" 是动态的文件列表。当我尝试将所有文​​件复制为一个文件时,它们实际上是从 xml 文件中读取的。
【解决方案2】:

如果是转义分号,您需要使用 %3b 转义它,请参阅 here 了解更多信息

如果您需要完整的信息,请点击这里

<ItemGroup>
      <Compile Include="c:\\test\\file1.txt%3Bc:\\test2\\file2.txt" /> 
   </ItemGroup>

<Copy SourceFiles="@(Compile)" DestinationFolder="c:\destination\%(RecursiveDir)">
</Copy>

【讨论】:

  • @Subhash-Dike 没有运气得到这个错误 MSBUILD:警告 MSB3021:无法将文件“c:\test\file1;c:\test2\file2”复制到“Dest2\\GettingAroundAirTaxiDe ccanAviation.aspx” 。CS”。不支持给定路径的格式。
  • @Subhash-Dike,上面 anton-k 的代码仅在“include”包含硬编码文件名路径时才有效,但我需要动态来自@filesCopy 的文件列表请查看我的代码。
【解决方案3】:

filesToCopy 视为属性,而不是 ItemGroup:

<FilesToCopy Include="$(filesToCopy)" Exclude="**\*trash*"/>

然后,当您调用 CopyFiles 目标时,使用分隔的文件列表填充 filesToCopy

msbuild CopyFiles.proj /t:CopyFiles /p:filesToCopy="c:\test\file1;c:\test2\file2"

或使用MSBuild 任务:

<Target Name="CallCopyFiles">
    <MSBuild Projects="CopyFiles.proj" Properties="filesToCopy=c:\test\file1;c:\test2\file2"/>
</Target>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 2014-09-14
    • 2011-09-25
    • 2016-03-09
    • 2011-08-18
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多