Скрипт Powershell для даты последнего изменения электронной почты - PullRequest
0 голосов
/ 09 января 2019

В настоящее время я являюсь системным администратором, пытающимся использовать скрипт Powershell для сравнения даты последнего изменения папки с текущей датой, чтобы определить, существует ли резервная копия более семи дней. Если это так, то он отправляет электронное письмо на счет нашей компании, предупреждая нас.

Электронная почта работает нормально, но проблема в том, что у каждого есть резервная папка (на 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 голосов
/ 09 января 2019

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

$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!" ; 
 }      
}

Спасибо за помощь в противном случае!

0 голосов
/ 09 января 2019

Вам необходимо получить 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!
  }
}
...