我最近开始创建一个powershell脚本,包括一个GUI。
为了防止GUI冻结,我创建了一个后台作业,其中运行函数"xyz“.
我想捕捉一个特定的窗口标题。如果此窗口关闭,则应启动If。
现在,我对这个脚本的问题如下:
如果我在没有将脚本放入后台作业的情况下运行脚本,它确实会注意到If语句并返回我想要的值。
如果我运行脚本并将任务放到后台作业中,这个作业就不会停止,也不会识别If语句。
有人有办法解决这个问题吗?
Function xyz {
$global:TitleArray = @("Termius - Hosts","Some Window Title","...")
$global:WindowClosed = $false
$global:TitleArray | Out-Host
$global:Job = start-job -Name FindGame {
Do {
(Get-Process | Where-Object {$_.MainWindowTitle -ne ""} | Select-Object MainWindowTitle) | % {
if($_.MainWindowTitle -in $global:TitleArray){
$global:WindowFound = $true
$global:FoundWindowName = $_.MainWindowTitle
do {
$WindowArray = @()
(Get-Process | Where-Object {$_.MainWindowTitle -ne ""} | Select-Object MainWindowTitle) | % {
$WindowArray += $_.MainWindowTitle
}
if($global:FoundWindowName -notin $WindowArray){
$global:WindowClosed = $true
}
Sleep 1
} while ($global:WindowClosed -ne $true)
}
if($global:WindowClosed){
$Global:FoundWindowName | Out-Host
exit
}
Sleep 1
}
} while ($true)
}
}
xyz发布于 2019-01-15 20:58:53
PowerShell作业(类型为PSJob)在单独的进程中运行,因此它们对调用程序的环境没有任何访问权,甚至不能访问全局范围中的变量。
要将信息输入到作业中,您应该在作业的脚本块中定义一个param()块,然后使用Start-Job的-ArgumentList参数发送值。请注意,这将是一次传入值。
要从作业中返回数据,只需像往常一样通过管道发送数据,并访问需要使用Get-Job来确定作业是否“有附加数据”的数据,如果有,则使用Receive-Job检索该数据。
不幸的是,所有这些都意味着您仍然需要您的主线程来管理后台工作,从而破坏了目标。
您可以使用相反,,并将其与可以引发事件的某种.Net对象配对。看起来它们确实在进程中运行,但更重要的是,它们可以根据您可能真正感兴趣的事件触发,而不需要管理循环。
所以,最简单的,也许只是为了了解你可以查看一个计时器示例,其中计时器对象在间隔内触发事件:
$timer = new-object timers.timer
$action = {write-host "Timer Elapse Event: $(get-date -Format ‘HH:mm:ss’)"}
$timer.Interval = 3000 #3 seconds
Register-ObjectEvent -InputObject $timer -EventName elapsed –SourceIdentifier thetimer -Action $action
$timer.start()
#to stop run
$timer.stop()
#cleanup
Unregister-Event thetimer但Microsoft页面上的示例甚至包括监视WMI中的进程创建事件,以便和/或进程退出事件(?)可能值得一查。
https://stackoverflow.com/questions/54206385
复制相似问题