Powershell проверяет папки и отправляет электронную почту

#arrays #powershell #email #get-childitem

#массивы #powershell #Адрес электронной почты #get-дочерний элемент

Вопрос:

У меня есть программа, которая проверяет два пути для файлов, и если есть какие-либо файлы, она отправляет по одному письму для одного человека каждый. Теперь им нужно проверить четыре пути, и нескольким пользователям требуется почта для пути. например

  • Путь 1 — Почта для x, y и z
  • Путь 2 — Почта для a и b
  • Путь 3 — Почта на x и a
  • Путь 4 — Почта для s, r и w

Как я могу сделать это простым и наиболее эффективным?

 $folders = @()
$folders  = "\serverfilesInfotest"
$folders  = "\serverfilesInfotest2"

$receiver = @()
$receiver  = "person1@test.com"
$receiver  = "person2@test.com"

$i = 0

$folders | ForEach-Object { 
  $checkforfiles = $_ 
  $directoryInfo = Get-ChildItem $checkforfiles | Measure-Object
  $directoryInfo.count #Returns the count of all of the objects in the directory

  $Numberone = $directoryInfo.Count

  if ($directoryInfo.count -ge 1){
    send-mailmessage -subject "Subject" -Body "There are $checkforfiles files " -from foldercheck@test.com  -to $receiver[$i] `
    -smtpserver  smtp.ser.com

    $i = $i 1
  }
  else{
    write-host "nothing to process"
  }     
}
 

Ответ №1:

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

Кроме того, я бы посоветовал использовать splatting для командлетов с большим количеством параметров, чтобы сделать код более чистым.

 # an array of folder paths to test
$folders = "\serverfilesInfotest", "\serverfilesInfotest2", "\serverfilesInfotest3", "\serverfilesInfotest4"

for ($i = 0; $i -lt $folders.Count; $i  ) {
    # get the file (and folder) count inside
    $count = @(Get-ChildItem -Path $folders[$i]).Count
    if ($count -gt 0) {
        # determine who to email
        $to = switch ($i) {
            0 { 'personX@test.com', 'personY@test.com', 'personZ@test.com' ; break }
            1 { 'personA@test.com', 'personB@test.com' ; break }
            2 { 'personX@test.com', 'personA@test.com' ; break }
            3 { 'personS@test.com', 'personR@test.com', 'personW@test.com' }
        }
        # set up a hashtable with parameters for splattting to Send-MailMessage
        $mailParams = @{
            To         = $to
            From       = 'foldercheck@test.com'
            Subject    = "Subject"
            Body       = "There are $count files in folder '$($folders[$i])'"
            SmtpServer = 'smtp.ser.com'
            # add more parameters here if needed
        }
        # send the email
        Send-MailMessage @mailParams
    }
    else {
        Write-Host "Empty folder '$folders[$i]'; Nothing to process"
    }
}
 

Комментарии:

1. Здравствуйте, прежде всего, спасибо за вашу помощь, большая часть из них работает идеально и значительно улучшила мой код, я никогда раньше не работал с switch. Есть одна проблема, почта, которую пользователь получает, даже если он находится только по одному пути, выглядит следующим образом: в папке ‘\ server files Info test server files Info test2 [1] есть 1 файл. Он все равно получает оба пути, хотя он тольков одном.