powershell可通过filesystemwatcher实现轻量级文件夹实时监控,需正确设置路径、启用递归与事件触发、注册事件处理脚本、统一utf8编码写入结构化日志,并用while循环保持脚本常驻,同时注意管理员权限及unc路径限制。
powershell 可以通过 filesystemwatcher 实时监控文件夹变化,配合日志写入功能实现轻量级文件监控。关键在于正确设置事件监听、避免脚本退出、处理中文路径和权限问题。
创建基础监控脚本
使用 System.IO.FileSystemWatcher 类监听目标路径的创建、删除、重命名和修改事件。需注意:该对象默认不递归子目录,需手动启用;且脚本运行后若不保持活跃状态,事件会丢失。
- 用
New-Object System.IO.FileSystemWatcher创建监听器实例 - 设置
Path(监控路径)、Filter(如*.*或*.log)、IncludeSubdirectories(设为$true) - 启用
EnableRaisingEvents = $true才能触发事件 - 每个事件(如
Created)需注册一个脚本块,用Register-ObjectEvent绑定
记录结构化日志到文件
日志建议包含时间戳、事件类型、文件全路径、操作用户(可选)。避免直接用 Add-Content 频繁写入,推荐使用 Out-File -Append 或 Write-Output | Out-File 保证编码统一(尤其含中文时用 -Encoding UTF8)。
- 每条日志格式示例:
$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') [Created] C:Data eport.xlsx - 日志文件路径建议用绝对路径,避免因执行位置变动导致写入失败
- 可添加
try/catch包裹日志写入逻辑,防止因磁盘满或权限不足中断监控
保持脚本长期运行并防止意外退出
PowerShell 控制台关闭或脚本执行完即退出,会导致监听停止。需让脚本“挂起”等待事件,同时支持安全退出。
- 在注册完所有事件后,加一句
while ($true) { Start-Sleep -Seconds 1 }保持进程活跃 - 可监听
Ctrl+C信号:用$host.UI.RawUI.KeyAvailable轮询,或更可靠地用Register-EngineEvent响应 PowerShell 退出事件 - 退出前调用
$watcher.EnableRaisingEvents = $false和Unregister-Event清理事件注册,避免残留
部署与权限注意事项
监控系统目录(如 C:Windows)或网络路径需管理员权限;NTFS 权限不足时可能收不到某些事件(如被拒绝访问的子文件夹)。建议先用普通用户测试本地非系统路径。
- 右键 → “以管理员身份运行” PowerShell,再执行脚本
- 若监控网络共享(
\servershare),确保当前用户有读取+遍历权限,且FileSystemWatcher对 UNC 路径支持有限,推荐映射为驱动器号(如Z:)后再监控 - 脚本保存为
.ps1文件后,需解除执行策略限制:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
不复杂但容易忽略细节,比如没开递归、没设编码、没保持进程存活——补上这几点,就能稳定跑起来。











