file - 删除 6 个月前的文件

标签 file msbuild last-modified delete-file

我想使用 Msbuild 删除文件夹中的文件,这些文件存在时间超过六个月 - 早于 6 个月。

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

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

有什么建议吗?

<Target Name="SomeTarget"> 

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

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

</Target> 

最佳答案

认为您无需在 native MSBuild 4 中使用自定义任务即可实现此目的,但我还没有开始使用它,因此无法发表评论。

但是,对于 native 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

关于file - 删除 6 个月前的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3511706/

相关文章:

c#比较两个文本文件并生成一个有差异的新文件

ios - 应用更新后我的图像已被删除

.net - MSBuild 错误 MSB3021 : Unable to copy file. 找不到文件 'obj\Release\myWebProject1.dll'

http - 通过 Nginx 无限期缓存 HTTP 响应失败

python - 如何在 Microsoft Azure 中提取 Blob 存储中的 Blob 的上次修改日期

file - 通过添加竞争条件来停止竞争条件?

windows - 使用 WMI 查询扩展文件属性

c# - 编辑 msi 数据库表

typescript - 如何在 Visual Studio 2019 错误列表中显示 eslint 错误

hive - 如何在Hive中查找表的最后修改时间戳?