Powershell脚本用于识别dir中的最旧文件并通知年龄

时间:2015-03-04 21:54:08

标签: powershell timestamp notify

这真的应该更简单,但我一直在愚蠢的价值观。 我想要的很简单。首先,如果文件夹中的文件超过一定年龄,我希望powershell发送电子邮件。这部分技术上有效。但剧本一直不稳定。实际上,我还希望通过电子邮件来说明该文件的年龄(尽管格式化为简单的xx分钟)

最初我使用的是这样的东西

 Get-ChildItem -path $queuepath -Recurse |
 Foreach-Object { 
  #write-host $_.fullname
  $dtdiff = New-TimeSpan ($_.CreationTime) $(Get-Date)

  if ($dtdiff.minutes -gt 120){ .....send an email stuff....

麻烦的是,它似乎没有针对所有项目运行最后一个命令。如果有超过120分钟的文件,它通常不会触发电子邮件,即使有较旧的文件..但实际上,我觉得修复语言以简单地定位文件夹中最旧的文件会更简单执行命令的其余部分。 (并生成一个干净的变量" X分钟旧的"我可以把它扔进电子邮件。

希望这是有道理的。谢谢你的时间。

2 个答案:

答案 0 :(得分:2)

不要为每个文件发送一封电子邮件;收集所有文件,过滤该列表,然后在一封电子邮件中发送完整列表。以下内容将为您提供一个变量($NewFiles),其中包含120分钟以上的所有文件及其分钟的年龄。然后,您可以进行测试以确保它不是$null,并根据您的电子邮件需要对其进行格式化。

$NewFiles = get-childitem -recurse -file -path $queuepath |
    Where-Object {$_.CreationTime -lt (get-date).AddMinutes(120)}|
    Select-Object -Property FullName,@{name="Age";expression={New-TimeSpan -start $_.creationtime -end $(get-date) | select-object -expandproperty minutes}};

换行符以便更好地格式化。

答案 1 :(得分:0)

为什么不直接获取文件列表,排序,抓取第一个文件,然后获取最后一个文件?难道你不需要知道什么吗?我不清楚你是否真的需要为每个文件发送电子邮件。

$Files = @(Get-ChildItem -Path $queuepath -Recurse | 
   Sort-Object -Property CreationTime);
$OldestFile = $Files[0];
$NewestFile = $Files[-1];    
$Now = Get-Date;

$AgeOfNewestFile = New-TimeSpan -Start ($NewestFile.CreationTime) -End $Now;
$AgeOfOldestFile = New-TimeSpan -Start ($OldestFile.CreationTime) -End $Now;

If ($AgeOfNewestFile.TotalMinutes -gt 120) {
    Send-MailMessage -Body "File '$($OldestFile.FullName)' is $($AgeOfOldestFile.TotalMinutes) minutes old, and no file is newer than 120 minutes." [....];
}

如果您不想在处理过程中添加文件夹,则可能需要在-File上添加Get-ChildItem选项。您指定了-Recurse选项,否则不会过滤文件夹。

此外,您还要使用TotalMinutes,而不是MinutesTotalMinutes包括小时,天,年等。Minutes 只是分钟,因此它永远不会超过59.如果文件是3小时10分钟旧的,Minutes将为10,但TotalMinutes将为190


如果您想要更好地格式化邮件,可以使用格式运算符和composite formatting这样的内容:

$Body = "File '{0}' is {1:dd} days, {1:hh} hours, and {1:mm} minutes old." -f $OldestFile.FullName, $AgeOfOldestFile;

或者像这样,如果你想要一个更固定的字符串:

$Body = "File '{0}' has an age of {1:c}." -f $OldestFile.FullName, $AgeOfOldestFile;

以[ - ] d.hh:mm:ss。[fffffff]的格式打印时间跨度。

如果你想挑剔,那么你可以做以下事情:

$Body = "File '{0}' is" -f $OldestFile.FullName;
If ($AgeOfOldestFile.TotalDays -gt 0) {
    $Body += " {0:dd} day(s)," -f $AgeOfOldestFile;
}

等等。

您不必使用格式运算符。您可以使用嵌入式子表达式。我这样做是因为它让它更容易阅读。好吧,当你理解格式化操作符正在做什么时。