2010-08-18 38 views
3

Je souhaite supprimer des fichiers d'un dossier de plus de six mois (moins de six mois) à l'aide de Msbuild.Supprimer les fichiers de plus de 6 mois

Je veux utiliser% ModifiedTime (bien connu des métadonnées Point) de MsBuild

Je préfère ne pas utiliser des tâches de douane, uniquement par défaut msbuild et Microsoft.Sdc.Tasks. J'utilise VS 2008, .net .35.

Des suggestions?

<Target Name="SomeTarget"> 

<ItemGroup> 
    <FilesToDelete Include="Path\**\*.zip"/> 
</ItemGroup> 

<Delete Files="@(FilesToDelete)" /> 

</Target> 

Répondre

7

Je pense que vous pouvez y parvenir sans avoir besoin d'utiliser des tâches personnalisées dans MSBuild 4 native, mais je ne l'ai pas commencé à jouer avec cela encore, donc je ne peux.

Cependant, comme pour MSBuild 3.5 natif, je ne pense pas que ce soit possible - pour pouvoir manipuler les dates, vous devez entrer dans le code. Vous voyez, les métadonnées ModifiedDate sont en interne une chaîne - et pour faire des manipulations sensibles, vous devez convertir en une date. Je ne suis pas sûr de ce qui est dans les tâches Sdc - je ne les utilise pas comme je préfère les CommunityTasks, mais même avec ces tâches, je ne peux pas penser à quelque chose qui fonctionnerait.

Les tâches MSBuild personnalisées ne sont pas si effrayantes - et je recommande que chaque projet (important) ait une solution qui est construite avant toute autre solution qui génère une DLL contenant vos tâches msbuild personnalisées dans un emplacement bien connu (par exemple dossier "lib" à la racine de votre source).

Si vous pouvez autoriser cela comme une solution alors voici une tâche que je viens en cloque qui permet d'atteindre ce que vous voulez:

using System; 
using System.Linq; 
using Microsoft.Build.Framework; 
using Microsoft.Build.Utilities; 

namespace Build.MsBuildTasks 
{ 
    public class FindFilesOlderThan : Task 
    { 
     [Required] 
     public ITaskItem[] Files { get; set; } 

     public int Months { get; set; } 

     public int Days { get; set; } 

     public int Years { get; set; } 

     [Output] 
     public ITaskItem[] MatchingFiles { get; set; } 

     public override bool Execute() 
     { 
      var olderThan = DateTime.UtcNow.AddYears(-Years).AddMonths(-Months).AddDays(-Days); 

      MatchingFiles = (from f in Files 
          where DateTime.Parse(f.GetMetadata("ModifiedTime")) < olderThan 
          select f).ToArray(); 

      return true; 
     } 
    } 
} 

Vous pouvez ensuite l'utiliser comme ceci:

<UsingTask AssemblyFile="$(MSBuildProjectDirectory)\..\lib\Build.MsBuildTasks.dll" 
    TaskName="Build.MsBuildTasks.FindFilesOlderThan" /> 

<Target Name="Purge"> 
    <ItemGroup> 
     <FilesToConsider Include="f:\temp\AzurePackages\**\*.*" /> 
    </ItemGroup> 

    <FindFilesOlderThan 
     Files="@(FilesToConsider)" 
     Months="6"> 
     <Output 
      TaskParameter="MatchingFiles" 
      ItemName="FilesToPurge"/> 
    </FindFilesOlderThan> 


    <Message Text="FilesToPurge: @(FilesToPurge)" /> 
</Target> 

de bien sûr, YMMV

+0

qu'est-ce que YMMV? thx – Kiquenet

+0

YMMV: votre milage peut varier ... –