C# Msbuild使用唯一的文件名复制并展平
我正在尝试从深度源代码树中复制多个具有相同文件名的文件。例如TestResults.trx。我想将它们复制到一个目录中(即展平)。问题是它们只是互相覆盖,而我只是在目录中找到了一个TestResults.trxC# 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
<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,看看我是否可以直接使用它,但看起来它不支持它。