【问题标题】:Delete files older 6 months删除 6 个月前的文件
【发布时间】:2010-08-18 11:48:52
【问题描述】:

我想删除文件夹中的文件,这些文件使用 Msbuild 超过 6 个月 - 超过 6 个月。

我想使用 MsBuild 的 %ModifiedTime (Well-known Item Metadata)

我不喜欢使用自定义任务,只使用 msbuild 默认和 Microsoft.Sdc.Tasks。我使用 VS 2008,.net .35。

有什么建议吗?

<Target Name="SomeTarget"> 

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

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

</Target> 

【问题讨论】:

    标签: file msbuild last-modified delete-file


    【解决方案1】:

    认为您无需在本机 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-22
      • 2014-07-15
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2020-01-29
      相关资源
      最近更新 更多