Я думаю Вы можете достичь этого без необходимости использовать пользовательские задачи в родном 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