PowerShell中FileSystemWatcher未触发.exe启动,控制台反复显示NotStarted求助
解决你的PowerShell FileSystemWatcher问题
嘿,我来帮你搞定这个PowerShell脚本的问题!你遇到的两个问题其实都是脚本结构和变量顺序的小问题,咱们一步步来修复:
问题根源分析
- 反复出现“NotStarted”提示:你把
FileSystemWatcher的创建和事件注册都放在了while($true)循环里,这意味着每2秒就会新建一个监听器并重复注册事件。PowerShell会不断生成未正确初始化的事件订阅,所以控制台会反复输出“NotStarted”状态。 - 事件未触发exe启动:你是先注册了事件,之后才定义
$action变量的——这就相当于你给事件绑定了一个还不存在的动作,自然不会有任何反应。
修复后的完整脚本
### 先定义事件触发后的动作(一定要先定义!) $action = { # 注意:路径有空格时,要用引号包裹exe路径,或者用-FilePath参数明确指定 Start-Process -FilePath "C:\Users\sammy\Documents\parsing Engine 1.0.exe" } ### 初始化FileSystemWatcher(只需要执行一次) $watcher = New-Object System.IO.FileSystemWatcher $watcher.Path = "C:\BigData\COLLECTION_A\L_READ" $watcher.Filter = "*.xlsx" # 去掉多余的*,避免匹配到类似.xlsx.txt的非目标文件 $watcher.IncludeSubdirectories = $true $watcher.EnableRaisingEvents = $true $watcher.NotifyFilter = [IO.NotifyFilters]'LastAccess,LastWrite,FileName,DirectoryName' ### 注册需要监听的事件(绑定之前定义好的$action) Register-ObjectEvent $watcher "Created" -Action $action | Out-Null Register-ObjectEvent $watcher "Changed" -Action $action | Out-Null Register-ObjectEvent $watcher "Renamed" -Action $action | Out-Null ### 保持脚本运行,让监听器持续工作(替代原来的无效循环) Write-Host "正在监控文件夹:$($watcher.Path),按任意键停止..." Read-Host
关键修复点说明
- 调整变量顺序:先定义
$action,再注册事件,确保注册时动作已经存在。 - 移除循环重复创建监听器:
FileSystemWatcher本身是异步后台监听的,不需要用while循环反复初始化,只需要保持脚本会话活跃即可(用Read-Host或者Wait-Event都可以)。 - 修正Filter格式:把
*.xlsx*改成*.xlsx,避免错误匹配到非Excel文件。 - 处理带空格的路径:启动带空格的exe时,用
-FilePath参数并包裹引号,避免PowerShell解析路径出错。 - 隐藏事件注册输出:在
Register-ObjectEvent后面加| Out-Null,避免控制台输出多余的事件订阅信息。
额外稳定性建议
如果需要更稳定的监听,可以添加基础的错误检查,比如提前验证目标文件夹是否存在:
if (-not (Test-Path $watcher.Path)) { Write-Error "目标文件夹不存在:$($watcher.Path)" exit }
内容的提问来源于stack exchange,提问作者Olujide Oluade




