У меня есть сценарий, который проверяет наличие новых файлов в нескольких папках, а затем отправляет электронное письмо с файлом журнала, если есть новые файлы.
$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
Есть ли способ заставить его работать так, чтобы он проверял все пути и, если есть новые файлы, отправлял только одно электронное письмо с журналом после проверки всех путей?





Вам просто нужна переменная, чтобы отслеживать, были ли найдены какие-либо новые файлы или нет, а затем вывести вызов 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
}
@Tomes: «Stack Overflow — это сайт вопросов и ответов для профессиональных программистов и энтузиастов». (см.: stackoverflow.com/tour)
@Tomas: Вы заметили и попытались понять комментарий в коде # define variable to track whether new files have been found? Другими словами, переменная отслеживает обнаружение новых файлов. Поэтому изначально он получит значение $false и будет обновляться до $true, когда что-то будет найдено.
Спасибо вам за разъяснение. Прочитал комментарий, но не совсем понял. Теперь мне ясно. Спасибо.
Большое спасибо. Он работает отлично. Если можно спросить, почему $newFileFound = $false, а затем $true? Я думаю, что переменная не должна быть одинаковой. Меня, как непрограммиста, это немного сбивает с толку.