#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 файл. Он все равно получает оба пути, хотя он тольков одном.