Windows 为什么这个简单的Powershell脚本在需要时不退出?

Windows 为什么这个简单的Powershell脚本在需要时不退出?,windows,powershell,Windows,Powershell,我派生了一个简单的Powershell脚本,当某个条件变为真时,该脚本应该退出文件删除、修改等 剧本: $watcher = New-Object System.IO.FileSystemWatcher $watcher.Path = "C:\Users\me\Desktop\folder\" $watcher.Filter = "*.*" $watcher.IncludeSubdirectories = $true $watcher.EnableRaisingEvents = $true

我派生了一个简单的Powershell脚本,当某个条件变为真时,该脚本应该退出文件删除、修改等

剧本:

$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\Users\me\Desktop\folder\"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true  
$continue = $true

$action = { 
            Write-Host "Action..."
            $anexe = "C:\Users\me\Desktop\aprogram.exe"
            $params = "-d filename"
            Start $anexe $params
            $continue = $false
          }    

Register-ObjectEvent $watcher "Created" -Action $action
Register-ObjectEvent $watcher "Changed" -Action $action
Register-ObjectEvent $watcher "Deleted" -Action $action
Register-ObjectEvent $watcher "Renamed" -Action $action
while ($continue) {sleep 1}
正如您所看到的,脚本应该在满足条件时退出,因为continue的值更改为false,所以应该执行操作,然后循环应该结束,脚本应该退出。然而,它一直在继续。即使满足条件,循环也是无止境的

我也尝试过使用exit。也不行。我试着删除sleep 1,但是,由于没有任何时间间隔的无限循环,它最终杀死了我的cpu

当满足文件更改条件时,如何将其修复为退出?

您的$action事件处理程序脚本块与脚本[1]不在同一范围内运行,因此您的脚本从未看到您在脚本块内设置的$continue变量

作为解决方法,您可以:

在脚本中初始化名为$continue的全局变量:$global:continue=$true

然后在事件处理程序脚本块中设置该变量:$global:continue=$false

并检查脚本循环中全局变量的值:while$global:continue{sleep 1}

请确保在退出脚本之前删除全局变量,否则它会在会话中逗留:remove variable-Scope global count

另外,通常,正如合理的建议,在完成监视后,请确保正确地处置System.IO.FileSystemWatcher实例:$watcher.dispose。
[1] 它在同一个会话中运行,但在@Theo的一个可能的副本中运行。

链接的帖子是相关的,但不是重复的,因为这个问题是关于使用事件处理程序中的一个变量将信息传递给主脚本。。