Powershell отправляет одно электронное письмо после проверки всех путей к файлам

У меня есть сценарий, который проверяет наличие новых файлов в нескольких папках, а затем отправляет электронное письмо с файлом журнала, если есть новые файлы.

$source = Get-Content "C:\AAA\source.txt"
$logDate = get-date -format yyyy-MM-dd
$logtime = get-date -format HH:mm
$log = "C:\AAA\$logdate.log"

$mailkomu = "[email protected]"
$mailod = "[email protected]"
$subject = "New files in DDD"
$zprava = "Message"

ForEach($path in $source){
    Test-path $path
    Write-Output "$logtime - $path - ok" | Out-File $log -Append 
    If ((Get-ChildItem -Path $path -Force | Measure-Object).Count -eq 0) {
        Write-Output "no files" | Out-File $log -Append
    }
    Else { 
        Write-Output "new files" | Out-File $log -Append
        $data = Get-ChildItem -Path $path -Recurse | Select-Object DirectoryName, Name
        $data | Out-File $log -Append
        Send-MailMessage -From $mailod -To $mailkomu -Subject $subject -Body $zprava -SmtpServer $SMTPServer -Attachments $log
        }
}

В исходном .txt есть 4 разных пути, но путей может быть больше. Количество не имеет значения. Проверка новых файлов работает отлично.

Проблема в том, что если есть новый файл, например. второй путь отправляет электронную почту немедленно и не ждет проверки других путей.

Example:
first path - no file - sends no email
second path - new file - sends email with log only for the first and the second path
third path - new file - sends email with log only for the first, second and the third path
fourth path - no file - sends no email

Есть ли способ заставить его работать так, чтобы он проверял все пути и, если есть новые файлы, отправлял только одно электронное письмо с журналом после проверки всех путей?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам просто нужна переменная, чтобы отслеживать, были ли найдены какие-либо новые файлы или нет, а затем вывести вызов Send-MailMessage из цикла — дождавшись завершения цикла, вы получите не более 1 электронного письма со всем журналом. , однажды:

$source = Get-Content "C:\AAA\source.txt"
$logDate = get-date -format yyyy-MM-dd
$logtime = get-date -format HH:mm
$log = "C:\AAA\$logdate.log"

$mailkomu = "[email protected]"
$mailod = "[email protected]"
$subject = "New files in DDD"
$zprava = "Message"

# define variable to track whether new files have been found
$newFilesFound = $false

foreach ($path in $source) {
    # start by actually acting on whether the path describes an existing item
    $folderStatus = Test-Path $path
    if (-not $folderStatus) {
        # log failure to locate source folder, then continue on to the next source folder in the loop
        Write-Output "$logtime - $path - not found" | Out-File $log -Append 
        continue
    }

    Write-Output "$logtime - $path - ok" | Out-File $log -Append 

    # path exists, let's fetch all sub-items up front
    $childItems = @(Get-ChildItem -Path $path -Force -Recurse)

    if ($childItems.Count -eq 0) {
        Write-Output "no files" | Out-File $log -Append
    }
    else { 
        Write-Output "new files" | Out-File $log -Append
        $data = Get-ChildItem -Path $path -Recurse | Select-Object DirectoryName, Name
        $data | Out-File $log -Append

        # set the indicator that files where found
        $newFilesFound = $true
    }
}

# only send email with log file if any new files were found
if ($newFilesFound) {
    Send-MailMessage -From $mailod -To $mailkomu -Subject $subject -Body $zprava -SmtpServer $SMTPServer -Attachments $log
}

Большое спасибо. Он работает отлично. Если можно спросить, почему $newFileFound = $false, а затем $true? Я думаю, что переменная не должна быть одинаковой. Меня, как непрограммиста, это немного сбивает с толку.

Tomas 14.07.2024 15:51

@Tomes: «Stack Overflow — это сайт вопросов и ответов для профессиональных программистов и энтузиастов». (см.: stackoverflow.com/tour)

Luuk 14.07.2024 19:33

@Tomas: Вы заметили и попытались понять комментарий в коде # define variable to track whether new files have been found? Другими словами, переменная отслеживает обнаружение новых файлов. Поэтому изначально он получит значение $false и будет обновляться до $true, когда что-то будет найдено.

Luuk 14.07.2024 19:35

Спасибо вам за разъяснение. Прочитал комментарий, но не совсем понял. Теперь мне ясно. Спасибо.

Tomas 14.07.2024 20:13

Другие вопросы по теме