C# Msbuild使用唯一的文件名复制并展平

C# Msbuild使用唯一的文件名复制并展平,c#,msbuild,build-process,mstest,C#,Msbuild,Build Process,Mstest,我正在尝试从深度源代码树中复制多个具有相同文件名的文件。例如TestResults.trx。我想将它们复制到一个目录中(即展平)。问题是它们只是互相覆盖,而我只是在目录中找到了一个TestResults.trx <ItemGroup> <SilverlightTestResults Include=".\**\*.trx" Exclude=".\TestResults\*" /> </ItemGroup> <Copy SourceFiles="@(S

我正在尝试从深度源代码树中复制多个具有相同文件名的文件。例如TestResults.trx。我想将它们复制到一个目录中(即展平)。问题是它们只是互相覆盖,而我只是在目录中找到了一个TestResults.trx

<ItemGroup>
  <SilverlightTestResults Include=".\**\*.trx" Exclude=".\TestResults\*" />
</ItemGroup>
<Copy SourceFiles="@(SilverlightTestResults)" DestinationFolder=".\TestResults">

我想我可以使用一些来进行转换,但似乎没有什么独特之处(我尝试在如下目录中实时复制的测试结果:。\SomeProject\bin\debug\TestResults.trx)

复制到这样的目录是理想的:

.\TestResults\TestResults1.trx .\TestResults\TestResults2.trx .\TestResults\TestResults3.trx .\TestResults\TestResults1.trx .\TestResults\TestResults2.trx .\TestResults\TestResults3.trx 我不在乎真正的名字,只要它们是唯一的


有什么想法,看起来需要定制任务吗?

是的,需要定制任务


您可以查看社区任务项目()中的
Move
任务提供了什么功能,但是如果它不满足您的需要,那么它是开源的,因此检查源代码并修改它以满足您的需要将是微不足道的。

我不能提供一个仅使用msbuild的解决方案-您可以使用 使用任务递增计数器

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
     <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
    <PropertyGroup>
    <FileCounter>0</FileCounter>
</PropertyGroup>
    <ItemGroup>
        <MySourceFiles SilverlightTestResults Include=".\**\*.trx" Exclude=".\TestResults\*"/>
    </ItemGroup>
<Target Name="CopyFiles">
    <Math.Add Numbers="$(FileCounter);1">
        <Output TaskParameter="FileCounter" PropertyName="FileCounter" />
    </Math.Add>
    <Copy
        SourceFiles="@(MySourceFiles)"
        DestinationFiles="@(MySourceFiles->'.\TestResults\%(Filename)_$(FileCounter)%(Extension)')"
    />
</Target>

0


但是,使用自定义任务或可能执行powershell脚本可能会做得更好。

您能否解释一下为什么要首先展平结构?巡航控制将拾取这些文件并将其合并到生成日志中。巡航控制系统不太支持通配符。例如,在ccnet.config中,您可以执行以下操作:TestResults\**.trx,但不能执行此TestResults\**.trx。此外,我可以让我的构建脚本生成唯一的文件名,但必须覆盖Silverlight toolkit中的目标,如果可以隔离对构建脚本的更改,这是一个不错的胜利。我还查看了xcopy,看看我是否可以直接使用它,但看起来它不支持它。