You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PowerShell中FileSystemWatcher未触发.exe启动,控制台反复显示NotStarted求助

解决你的PowerShell FileSystemWatcher问题

嘿,我来帮你搞定这个PowerShell脚本的问题!你遇到的两个问题其实都是脚本结构和变量顺序的小问题,咱们一步步来修复:

问题根源分析

  1. 反复出现“NotStarted”提示:你把FileSystemWatcher的创建和事件注册都放在了while($true)循环里,这意味着每2秒就会新建一个监听器并重复注册事件。PowerShell会不断生成未正确初始化的事件订阅,所以控制台会反复输出“NotStarted”状态。
  2. 事件未触发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

火山引擎 最新活动