Удалить файлы старше 6 месяцев - PullRequest
3 голосов
/ 18 августа 2010

Я хочу удалить файлы в папке, которые старше шести месяцев - старше 6 месяцев при использовании Msbuild.

Я хочу использовать% ModifiedTime (метаданные общеизвестных элементов) MsBuild

Я предпочитаю не использовать таможенные задачи, только msbuild default и Microsoft.Sdc.Tasks.Я использую VS 2008, .net .35.

Есть предложения?

<Target Name="SomeTarget"> 

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

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

</Target> 

1 Ответ

7 голосов
/ 18 августа 2010

Я думаю Вы можете достичь этого без необходимости использовать пользовательские задачи в родном MSBuild 4, но я еще не начал играть с этим, поэтому не могу комментировать.

Однако, что касается родного MSBuild 3.5, я не думаю, что это возможно - чтобы манипулировать датами, нужно разбить код. Видите ли, метаданные ModifiedDate внутренне являются строкой, и для разумных манипуляций вам необходимо преобразовать их в дату.

Я не уверен, что находится в задачах Sdc - я не использую их, так как предпочитаю задачи сообщества, но даже с этими задачами я не могу придумать ничего, что могло бы работать.

Настраиваемые задачи MSBuild не так уж страшны - и я рекомендую, чтобы у каждого (масштабного) проекта было решение, созданное до любого другого решения, которое выводит DLL, содержащую ваши настраиваемые задачи msbuild, в хорошо известное место (например, ") 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

...