【问题标题】:PowerShell: Check a folder for changes and if so, send an e-mailPowerShell:检查文件夹是否有更改,如果有,请发送电子邮件
【发布时间】:2025-11-25 11:55:02
【问题描述】:

我有一个同事有很多创意,但我没有 PowerShell 方面的天赋。他希望定期检查文件夹是否有更改。将新文件添加到文件夹后,他希望通过邮件收到通知。所以,我想我需要一个 PS 脚本。

不过,我完全不知道该怎么做。

我找到了以下代码 - 可以修改它来完成这项工作吗?

Param (
    [string]$Path = "C:\Test",
    [string]$SMTPServer = "SMTP IP",
    [string]$From = "MyMail@domain.com",
    [string]$To = "MyMail@domain.com",
    [string]$Subject = "New stuff!"
)

$SMTPMessage = @{
    To         = $To
    From       = $From
    Subject    = "$Subject at $Path"
    Smtpserver = $SMTPServer
}

$File = Get-ChildItem $Path | Where { $_.LastWriteTime -ge [datetime]::Now.AddMinutes(-1) }
If ($File) {
    $SMTPBody = "`nThe following files have recently been added/changed:`n`n"
    $File | ForEach { $SMTPBody += "$($_.FullName)`n" }
    Send-MailMessage @SMTPMessage -Body $SMTPBody
}

任何帮助将不胜感激。

【问题讨论】:

标签: powershell email notifications smtp directory


【解决方案1】:

要获得有关特定文件夹和/或其子项目更改的通知,可以使用 .Net Frameworks FileSystemWatcher 类。使用 PowerShell 实例化一个新的:

$pattern = "*.*"
$watcherProperties = @{
    IncludeSubdirectories = $false;
    NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
    }
$watcher = New-Object IO.FileSystemWatcher $Path, $pattern -Property @watcherProperties

然后,要获得有关更改的通知,请使用 Register-ObjectEvent 注册一个事件并添加您的邮件块:

Register-ObjectEvent $watcher Created -SourceIdentifier FileCreated -Action {
    $SMTPBody = "`nThe following file have recently been added/changed:`n`n$($Event.SourceEventArgs.Name)"
    Send-MailMessage @SMTPMessage -Body $SMTPBody}
}

虽然这是一个很好的自动通知解决方案,没有繁重的循环,但它也有一些缺点。在此配置中,每个 文件更改都会收到一封邮件。 移动带有一堆文件的目录会导致 - 一堆邮件。

您可以在此处阅读有关FileSystemWatchers 的更多信息:

【讨论】:

    最近更新 更多