You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Powershell脚本Register-ObjectEvent不触发显示Not started如何修复

文件夹监控PowerShell脚本Not Started错误修复方案

错误根因

出现Not started错误的核心原因是PowerShell的垃圾回收机制自动回收了未被引用的事件订阅对象,此外还有路径权限、bat调用参数缺失的潜在问题。

修复步骤

  • 为每个事件订阅添加唯一SourceIdentifier,同时保留事件订阅的引用变量,避免被GC回收
  • 配置FileSystemWatcher的NotifyFilter参数,明确需要监听的文件变更类型,减少误触发
  • 调用bat时指定工作目录参数,避免bat内的相对路径执行异常
  • 添加错误捕获逻辑,方便排查执行过程中的异常
  • 确保运行脚本的账户对监控目录、bat文件有读取和执行权限

修正后完整脚本

# 临时调整当前会话执行策略,允许本地脚本运行
Set-ExecutionPolicy RemoteSigned -Scope Process -Force

### 配置监控参数
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\inetpub\wwwroot\exports\"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true  
# 明确监听的变更类型,避免高频无效事件
$watcher.NotifyFilter = [IO.NotifyFilters]::FileName -bor [IO.NotifyFilters]::DirectoryName -bor [IO.NotifyFilters]::LastWrite

### 事件触发后执行的动作
$action = { 
    try {
        # 指定bat的工作目录,避免相对路径执行失败
        Start-Process -FilePath "C:\inetpub\wwwroot\exports\services\execute.bat" `
                      -WorkingDirectory "C:\inetpub\wwwroot\exports\services\" `
                      -WindowStyle Hidden
        Write-Host "$(Get-Date) 事件触发,已执行execute.bat"
    }
    catch {
        Write-Host "$(Get-Date) 执行bat出错:$_"
    }
}    

### 注册需要监听的事件
$jobCreated = Register-ObjectEvent $watcher "Created" -SourceIdentifier "FSW_Created" -Action $action
$jobChanged = Register-ObjectEvent $watcher "Changed" -SourceIdentifier "FSW_Changed" -Action $action
$jobDeleted = Register-ObjectEvent $watcher "Deleted" -SourceIdentifier "FSW_Deleted" -Action $action
$jobRenamed = Register-ObjectEvent $watcher "Renamed" -SourceIdentifier "FSW_Renamed" -Action $action

Write-Host "文件夹监控已启动,监控路径:$($watcher.Path)"
# 保持脚本运行,定期检查订阅状态
while ($true) {
    $allJobs = Get-Job -SourceIdentifier FSW_*
    foreach ($job in $allJobs) {
        if ($job.State -ne 'Running') {
            Write-Host "$(Get-Date) 事件订阅$($job.Name)状态异常:$($job.State)"
        }
    }
    Start-Sleep 5
}

验证方法

脚本运行后,新开PowerShell窗口执行以下命令查看订阅状态:
Get-Job -SourceIdentifier FSW_*
正常状态显示为Running,如果存在异常可通过以下命令查看错误详情:
Receive-Job -Id <对应Job的ID号>

注意:如需长期后台运行,建议将脚本注册为Windows计划任务,触发条件设置为系统启动,运行账户选择具备对应目录权限的管理员账户,勾选「不管用户是否登录都要运行」选项即可。

内容的提问来源于stack exchange,提问作者Rick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:45:01