PowerShell 利用 FileSystemWatcher 类实现高效实时文件监控,通过事件注册捕获创建、修改、删除、重命名四类变动并写入日志,支持缓冲区调优、去重、异常防护及后台常驻,还可触发自动归档或邮件告警等扩展操作。
powershell 可以高效、轻量地监控关键文件变动,无需轮询,靠系统底层通知机制实时响应。核心是 filesystemwatcher 类,搭配事件注册与日志写入,就能构建稳定可靠的监控体系。
设置监控对象与基础参数
先创建 watcher 实例,指定路径、启用事件,并决定是否递归子目录:
- $watcher = New-Object System.IO.FileSystemWatcher
- $watcher.Path = "C:ImportantData"(替换为你的真实路径)
- $watcher.IncludeSubdirectories = $true(如需监控所有子文件夹)
-
$watcher.Filter = "*.xlsx, *.docx, *.pdf"(支持通配符,多个类型需分多次设置或用
.*兜底) - $watcher.EnableRaisingEvents = $true
捕获四类变动并记录到文件
统一用一个 $action 块处理事件,避免重复代码,确保日志格式一致:
-
$action = {
$path = $Event.SourceEventArgs.FullPath
$changeType = $Event.SourceEventArgs.ChangeType
$time = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$logLine = "$time | $changeType | $path"
Add-Content "C:LogsFileChange.log" -Value $logLine
} - 然后一次性注册全部事件:
Register-ObjectEvent $watcher Created -Action $action
Register-ObjectEvent $watcher Changed -Action $action
Register-ObjectEvent $watcher Deleted -Action $action
Register-ObjectEvent $watcher Renamed -Action $action
增强稳定性与实用性
生产环境建议补充以下几点,避免漏事件或脚本中断:
- 调大缓冲区:快速连续操作可能丢事件,加一行 $watcher.InternalBufferSize = 65536
- 防重复触发:某些编辑器保存时会先删后建,可加简单时间去重逻辑(例如 500ms 内同名事件只记一次)
-
异常防护:把
Add-Content包在try/catch中,防止日志盘满或权限不足导致整个监控停摆 - 后台常驻:末尾加 while ($true) { Start-Sleep -Seconds 30 },再配合任务计划程序或 NSSM 封装为 Windows 服务
扩展用途:变动后自动执行操作
日志只是基础,你还能在 $action 中加入实际动作,比如:
- 发现新 PDF 就自动复制到归档服务器:
if ($changeType -eq 'Created' -and $path.EndsWith('.pdf')) { Copy-Item $path "\backuppdfs" -Force } - 检测到敏感文档被删除,立刻发邮件告警:
if ($changeType -eq 'Deleted' -and $path -match 'confidential') { Send-MailMessage -To "admin@domain.com" -Subject "敏感文件已删除" -Body "$path 被删除于 $time" ... }











