Powershell脚本到电子邮件的最新修改日期

时间:2019-01-08 21:31:02

标签: powershell powershell-v2.0 powershell-v3.0

我目前是一名系统管理员,试图使用Powershell脚本将文件夹的上次修改日期与今天的日期进行比较,以查看备份是否已超过7天。如果是,那么它将向我们的公司帐户发送一封电子邮件,提醒我们。

电子邮件部分工作正常,但问题是将每个人的备份文件夹(在NAS上)排列在阵列中并被调用以进行检查。到目前为止的代码是:

$paths = ($backup1 = "Y:\DESKTOP-OQRSLAU\Backup Set*"),
     ($backup2 = "V:\DESKTOP-I6B29SG\Backup Set*")

$lastWrite = (get-item $paths).LastWriteTime

foreach($backup in $paths){
if ($lastWrite -ge (get-date).AddDays(-7).ToString("yyyy-MM-dd")){
Write-Output "Success!"
$message = new-object Net.Mail.MailMessage;
    $message.From = $email_from_address;
    foreach ($to in $email_to_addressArray) {
        $message.To.Add($to);
    }
    $message.Subject =  ("BACKUP WARNING: " + "Out of Date Backup");
    $message.Body =     "`r`n`r`n";
    $message.Body +=    " ";
    $message.Body +=    " ";
    $message.Body +=    ("The following machines backup is out of date:     " + $env:computername + "`r`n");
    $message.Body +=    "`r`n";
    $message.Body +=    "`r`n";
    $message.Body +=    ("The latest backup for this machine is:   " + $lastWrite + "`r`n");
    $message.Body +=    "`r`n";
    $message.Body +=    "`r`n";
    $message.Body +=    ("***This warning will fire when a backup is older than seven days***");
            $message.Body +=        ""

    $smtp = new-object Net.Mail.SmtpClient($email_smtp_host, $email_smtp_port);
    $smtp.EnableSSL = $email_smtp_SSL;
    $smtp.Credentials = New-Object System.Net.NetworkCredential($email_username, $email_password);
    $smtp.send($message);
    $message.Dispose();
    write-host "... E-Mail sent!" ; 
} 
else {
exit
}
}

我现在通过电子邮件收到的回复仅适用于上面列出的第一个路径(Y:驱动器)。知道我在做什么错吗?我对Powershell不太了解。预先感谢!

2 个答案:

答案 0 :(得分:1)

您需要在循环的路径中获取LastWriteTime。我还建议您以更标准的数组格式设置$ Paths。

$paths = @("Y:\DESKTOP-OQRSLAU\Backup Set*","V:\DESKTOP-I6B29SG\Backup Set*")
foreach ($backup in $paths) {
  $lastWrite = (get-item $backup).LastWriteTime
  if ($lastWrite -ge (get-date).AddDays(-7).ToString("yyyy-MM-dd")) {
    # Do Stuff...
  }
  else {
    # Some other action NOT exit!
  }
}

答案 1 :(得分:0)

我发现了问题,这是我的一个头疼的错误。代码的一部分用于其他目的,并在消息正文的底部调用运行脚本的计算机名称,而不是路径名称。

$paths = @("Y:\DESKTOP-OQRSLAU\Backup Set*", "V:\DESKTOP-I6B29SG\Backup Set*")

foreach($backup in $paths){
$mostRecent = (get-date).AddDays(-365).ToString("yyyy-MM-dd")
$lastWrite = (get-item $backup).LastWriteTime
foreach($lastWriteDate in $lastWrite){
    if ($lastWriteDate -ge $mostRecent) {
        $mostRecent = $lastWriteDate;
    }
};
if ($mostRecent -ge (get-date).AddDays(-50).ToString("yyyy-MM-dd")){
    $message = new-object Net.Mail.MailMessage;
    $message.From = $email_from_address;
    $message.To.Add($email_to_address);
    $message.Subject =  ("BACKUP WARNING: " + "Out of Date Backup");
    $message.Body =     "`r`n`r`n";
    $message.Body +=    ("THE CHURCH ONLINE BACKUP MONITOR");
    $message.Body +=    " ";
    $message.Body +=    "`r`n`r`n";
    $message.Body +=    " ";
    $message.Body +=    ("The following backup is out of date:     " + $backup + 
"`r`n");
    $message.Body +=    "`r`n";
    $message.Body +=    "`r`n";
    $message.Body +=    ("The latest backup for this machine is:   " + $mostRecent + 
"`r`n");
    $message.Body +=    "`r`n";
    $message.Body +=    "`r`n";
    $message.Body +=    ("***This warning will fire when a backup is older than seven 
days***");               
    $message.Body +=        ""

    $smtp = new-object Net.Mail.SmtpClient($email_smtp_host, $email_smtp_port);
    $smtp.EnableSSL = $email_smtp_SSL;
    $smtp.Credentials = New-Object System.Net.NetworkCredential($email_username, 
$email_password);
    $smtp.send($message);
    $message.Dispose();
    write-host "... E-Mail sent!" ; 
 }      
}

否则,谢谢您的帮助!