如何实现FileSystemWatcher全天运行?解决关闭PowerShell窗口即停止问题
实现FileSystemWatcher 24小时不间断运行的解决方案
我来帮你搞定这个持续监控的问题,你遇到的两个小麻烦(重复运行报错、关闭ISE就停止)都有明确的解决办法,而且完全可以通过任务计划程序实现24小时不间断监控,下面一步步来拆解:
一、先解决重复运行时的「subscriber already exists」错误
重复运行脚本时报错,是因为之前注册的事件订阅还残存在PowerShell会话里。只要在脚本开头加一行清理命令,就能彻底解决这个问题:
# 先移除已存在的同名事件订阅(如果有),避免重复运行报错 Unregister-Event -SourceIdentifier FileCreated -ErrorAction SilentlyContinue $folder = 'G:\localexcelfiles\Logistics\logistics automation' $filter = '*.*' # 你可以改成'*.xlsx'来仅监控Excel文件 $fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{ IncludeSubdirectories = $false NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite' } $onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action { $path = $Event.SourceEventArgs.FullPath $Filename = $Event.SourceEventArgs.Name $changeType = $Event.SourceEventArgs.ChangeType $timeStamp = $Event.TimeGenerated # 这里可以添加你的文件处理逻辑,比如输出日志或者调用处理函数 "[$timeStamp] $changeType : $Filename at $path" | Out-File "C:\Scripts\MonitorLog.txt" -Append } # 让脚本保持运行状态,否则会话结束后事件订阅会直接失效 while ($true) { Start-Sleep -Seconds 30 }
注意我在脚本末尾加了个无限循环,让脚本一直处于运行状态——不然PowerShell执行完所有代码就会自动退出,事件订阅也就跟着失效了。
二、通过任务计划程序实现24小时不间断运行
关闭ISE后脚本停止,是因为脚本在交互式会话里运行,会话一结束进程就终止了。用任务计划程序可以把脚本改成后台服务式的运行,哪怕你注销账号、关闭所有窗口,它都能持续监控。
步骤1:创建自定义任务
打开「任务计划程序」,点击右侧的创建任务(别选「创建基本任务」,自定义任务能配置更多细节)。
步骤2:配置常规选项
- 名称:比如「物流文件夹监控脚本」,方便识别
- 安全选项:勾选「不管用户是否登录都要运行」(核心!这样即使你注销账号,任务依然在后台跑),然后选择一个有监控文件夹读写权限的账户(建议用本地管理员账户,避免权限不足的坑),再勾选「使用最高权限运行」。
步骤3:配置触发器
点击「触发器」选项卡,新建一个触发器:
- 选择「启动时」(电脑开机就自动启动任务),或者「登录时」(用户登录后启动),按需选择;
- 可以设置「延迟任务时间」为1分钟,避免开机时系统资源紧张导致脚本启动失败。
步骤4:配置操作
点击「操作」选项卡,新建操作:
- 操作:选择「启动程序」
- 程序/脚本:输入
powershell.exe - 添加参数:把下面的路径换成你的脚本绝对路径,复制进去:
简单解释下参数:-NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File "C:\Scripts\YourMonitorScript.ps1"-NoProfile:不加载PowerShell配置文件,加快启动速度-WindowStyle Hidden:后台静默运行,不会弹出PowerShell窗口-ExecutionPolicy Bypass:绕过系统执行策略限制,确保脚本能正常运行-File:指定要运行的脚本文件路径
步骤5:配置条件和设置
- 条件选项卡:取消勾选「只有在计算机使用交流电源时才启动此任务」,确保笔记本用电池时也能正常监控;
- 设置选项卡:
- 勾选「如果任务失败,每隔5分钟重试」,重试3次,避免临时故障导致任务中断;
- 勾选「允许任务按需运行」,方便你手动测试;
- 选择「如果任务已经运行,以下规则适用」:推荐选「不要启动新实例」,避免多个脚本同时监控同一个文件夹造成冲突;
- 可以取消勾选「如果任务运行时间超过X小时就停止」,或者设置一个较长的时间(比如24小时),确保脚本持续运行。
步骤6:测试验证
配置完成后,回到任务计划程序主界面,找到你创建的任务,右键点击「运行」,然后往监控文件夹里扔个测试文件,检查日志文件(就是脚本里配置的MonitorLog.txt)是否有记录,确认脚本正常工作。
额外提醒
- 所有路径用绝对路径:脚本里的监控文件夹、日志文件路径,还有任务计划里的脚本路径,都要用绝对路径,别用相对路径,避免找不到文件;
- 日志很重要:一定要在脚本里加日志输出,方便后续排查问题;
- 权限提前确认:确保任务用的账户对监控文件夹有读写权限,否则FileSystemWatcher可能触发不了事件。
内容的提问来源于stack exchange,提问作者sireesha
相关产品推荐
相关产品推荐

