2010-01-17 8 views
2

J'essaie de copier plusieurs fichiers à partir d'un arbre de source profonde qui ont le même nom de fichier. Par exemple TestResults.trx. Je veux les copier dans un seul répertoire (c'est-à-dire aplati). Le problème est qu'ils se remplacent juste l'un l'autre et je finis avec un seul TestResults.trx dans le répertoire.Msbuild copier et aplatir avec des noms de fichiers uniques

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

Je pensais que je pouvais faire une transformation à l'aide un peu well known metadata, mais il ne semble pas être quelque chose d'unique là-bas pour le faire (les résultats des tests que je essaie de copier en direct dans des répertoires comme ceci:. \ SomeProject \ bin \ debug \ TestResults.trx).

copie dans un répertoire comme celui-ci comme celui-ci serait idéal:

 
.\TestResults\TestResults1.trx 
.\TestResults\TestResults2.trx 
.\TestResults\TestResults3.trx 

Je ne se soucient pas des noms réels tant qu'ils sont uniques.

Des idées, cela ressemble à une tâche personnalisée?

+0

Pouvez-vous expliquer pourquoi vous voulez aplatir la structure en premier lieu? –

+0

Ces fichiers seront récupérés par Cruise Control et fusionnés dans le journal de construction. Le régulateur de vitesse n'a pas un grand support pour les caractères génériques. Par exemple, dans ccnet.config vous pouvez faire ceci: TestResults \\ *. Trx, mais pas ce TestResults \\ ** \\ *. Trx. De plus, je pourrais avoir mon script de génération de générer des noms de fichiers uniques, mais devrait remplacer les cibles de la boîte à outils Silverlight, si les changements peuvent être isolés pour le script de construction, c'est une belle victoire. – Keith

+0

J'ai aussi jeté un coup d'œil à xcopy pour voir si je pouvais juste débourser ça, mais ça ne semble pas le supporter. – Keith

Répondre

1

Je ne peux pas fournir une solution qui utilise juste msbuild - vous pouvez soit utiliser msbuildtasks pour utiliser le < Ajouter/> tâche pour incrémenter un compteur.

<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> 

Cependant, vous pourriez faire mieux avec une tâche personnalisée ou exécuter probablement un script Powershell.

1

Oui, une tâche personnalisée sera requise.

Vous pouvez regarder pour voir quelle fonctionnalité la tâche Move du projet de tâche de communauté (link here) offre, mais si elle ne fait pas ce que vous voulez alors c'est open source, ainsi il sera trivial de vérifier la source et modifiez-le en fonction de vos besoins.