首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell -notin数组不会触发if语句

Powershell -notin数组不会触发if语句
EN

Stack Overflow用户
提问于 2019-01-15 20:30:57
回答 1查看 192关注 0票数 2

我最近开始创建一个powershell脚本,包括一个GUI。

为了防止GUI冻结,我创建了一个后台作业,其中运行函数"xyz“.

我想捕捉一个特定的窗口标题。如果此窗口关闭,则应启动If。

现在,我对这个脚本的问题如下:

如果我在没有将脚本放入后台作业的情况下运行脚本,它确实会注意到If语句并返回我想要的值。

如果我运行脚本并将任务放到后台作业中,这个作业就不会停止,也不会识别If语句。

有人有办法解决这个问题吗?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-15 20:58:53

PowerShell作业(类型为PSJob)在单独的进程中运行,因此它们对调用程序的环境没有任何访问权,甚至不能访问全局范围中的变量。

要将信息输入到作业中,您应该在作业的脚本块中定义一个param()块,然后使用Start-Job-ArgumentList参数发送值。请注意,这将是一次传入值。

要从作业中返回数据,只需像往常一样通过管道发送数据,并访问需要使用Get-Job来确定作业是否“有附加数据”的数据,如果有,则使用Receive-Job检索该数据。

不幸的是,所有这些都意味着您仍然需要您的主线程来管理后台工作,从而破坏了目标。

您可以使用相反,,并将其与可以引发事件的某种.Net对象配对。看起来它们确实在进程中运行,但更重要的是,它们可以根据您可能真正感兴趣的事件触发,而不需要管理循环。

所以,最简单的,也许只是为了了解你可以查看一个计时器示例,其中计时器对象在间隔内触发事件:

代码语言:javascript
复制
$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中的进程创建事件,以便和/或进程退出事件(?)可能值得一查。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54206385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档