我認爲你可以做到這一點,而無需在本地的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
什麼是YMMV? thmm – Kiquenet 2010-08-19 10:05:43
YMMV:你的Milage May Vary ... – 2010-08-19 10:30:17