PowerShell - 未找到MainWindowTitle时循环

时间:2017-09-07 10:19:54

标签: powershell

我是PowerShell的首发,所以这可能是一个愚蠢的问题。

这是一个简单的脚本。我想打开一个本身打开不同窗口的程序。第一个是一个窗口,询问我是否要连接。使用

[System.Windows.Forms.SendKeys]::SendWait("{TAB}{TAB}{TAB}{TAB}{ENTER}")

我只是确认我想要连接。现在下一个窗口很棘手。加载需要一些时间,我知道它的MainWindowTitle。我不想做的是写

Start-Sleep -Milliseconds 20000

为了等待足够长的时间。有时它会在几秒钟内打开,有时甚至会超过20秒。所以我认为将一些东西放在一个循环中并等待该过程完全启动是个好主意。这就是我所做的(以及什么不起作用......):

while (!$winid) {
  Start-Sleep -Milliseconds 1000
  $winid = Get-Process |where {$_.MainWindowTitle -like "*windowtitle*"} |select -expand id
  write-host $winid
}

我有write-host $winid来显示我的Get-Process的结果。但即使窗口长时间打开,它也是整个时间。

当我停止我的脚本并简单地写

Get-Process |where {$_.MainWindowTitle -like "windowtitle"} |select -expand id

它有效!不知道为什么......

如何让脚本检查所需窗口是否已打开并准备好进行某些击键?

谢谢, 托拜厄斯

1 个答案:

答案 0 :(得分:1)

你提到你的脚本正在打开程序。 如果是这样,您可以使用-PassThru开关直接使用Start-Process获取进程句柄。

$MyProcess = Start-Process 'notepad.exe' -PassThru 

一个完整的例子:

$MyProcess = Start-Process 'notepad.exe' -PassThru 

While ($MyProcess.MainWindowHandle -eq 0) {
Start-Sleep -Seconds 1
}

Write-Host -ForegroundColor Cyan $MyProcess.MainWindowHandle

如果可以使用具有该标题的多个窗口,则效率更高并且具有优势,因为您实际使用了您已知道已启动的过程中的句柄。

至于你的具体错误,我在测试你的脚本时得到了它,直到我在重置变量之前放入$ winid = $ null。我想如果你实际调用脚本,$ winid每次都会为null,但是如果你通过IDE测试这个脚本,那么变量可能会在执行之间停留,这意味着它会在第一次运行但是永远不会进入while循环之后因为$ winid值仍然会被设定。