删除较早6个月的文件

Kiq*_*net 3 msbuild file last-modified delete-file

我希望删除一个文件夹中的文件,这些文件超过六个月 - 使用Msbuild,超过6个月.

我想使用MsBuild的%ModifiedTime(众所周知的项元数据)

我不喜欢使用海关任务,只有msbuild默认和Microsoft.Sdc.Tasks.我使用VS 2008,.net .35.

有什么建议 ?

<Target Name="SomeTarget"> 

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

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

</Target> 
Run Code Online (Sandbox Code Playgroud)

Pet*_*voy 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你会像这样使用它:

<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>
Run Code Online (Sandbox Code Playgroud)

当然,YMMV