2010-08-18 5 views
3

Msbuild를 사용하여 6 개월 이상인 폴더에서 파일을 삭제하고 싶습니다.파일 지우기 이전 달 6 개월

은 내가 세관 작업 만 msbuild를 기본 및 Microsoft.Sdc.Tasks을 사용하지 선호 MSBUILD

의 %의 ModifiedTime (잘 알려진 항목 메타 데이터)를 사용합니다. 나는 VS 2008, .net .35를 사용한다.

제안 사항?

<Target Name="SomeTarget"> 

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

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

</Target> 

답변

7

나는 당신이 기본 MSBuild에 4 사용자 지정 작업을 사용하지 않고도이를 달성 할 수 있다고 생각 ,하지만 난 아직 그와 함께 연주 시작하지 않은, 그렇게 말씀 드릴 수 없습니다.

그러나 네이티브 MSBuild 3.5는 코드로 나눌 필요가있는 날짜를 조작하기 위해 불가능하다고 생각합니다. ModifiedDate 메타 데이터는 내부적으로 문자열이며, 합리적인 조작을 수행하려면 날짜로 변환해야합니다.

Sdc 작업에 무엇이 있는지 잘 모르겠습니다. CommunityTasks를 선호하기 때문에 사용하지 않지만 이러한 작업을해도 작동 할 것이라고는 생각하지 않습니다.

맞춤형 MSBuild 작업은 무섭지 않습니다. 모든 (상당한) 프로젝트에 사용자 지정 msbuild 작업이 포함 된 DLL을 잘 알고있는 위치에 출력하는 다른 솔루션보다 먼저 빌드해야하는 솔루션이 있어야합니다 (예 : 소스의 루트에있는 "lib"폴더).

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

당신은 다음과 같이 사용합니다 : :의

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

당신이 여기에 솔루션으로이를 허용 할 수있는 경우

그게 당신이 원하는 것을 달성 나는 그냥 기절 작업입니다 코스, YMMV

+0

YMMV 란 무엇입니까? thx – Kiquenet

+0

YMMV : 귀하의 Milage 5 월 다를 수 있습니다 ... –