2017-09-07 47 views
0

我是PowerShell的首發,所以也許這是一個愚蠢的問題。PowerShell - 循環雖然MainWindowTitle未找到

這是一個簡單的腳本。我想打開一個本身打開不同窗口的程序。第一個只是一個問我是否想要連接的窗口。使用

[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展示我的獲取,處理的結果。但是,即使窗口已經打開很長時間,它仍然是NULL。

當我停止我的劇本,只是寫

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

它的作品!不知道爲什麼...

如何讓腳本檢查是否需要打開窗口並準備好一些擊鍵?

感謝, 托比亞斯

回答

1

您mentionned腳本被打開程序。 如果是這樣,您可以直接使用Start-Process和-PassThru開關獲取進程句柄。

$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每次都會爲空,但是如果你正在通過IDE測試這個腳本,那麼這個變量可能會在執行之間粘住,這意味着它會在第一次運行,但不會進入while循環之後因爲$ winid值仍然會被設置。

+1

感謝您的回答!我打開的應用程序基本上是創建一個遠程連接。在這樣做的時候,它會打開第一個窗口 - 這將與您的代碼一起工作。但是,當我選擇「連接」,並且因此我得到一個新的進程ID時,該窗口會再次直接關閉。我發現我試圖捕獲的新窗口的窗口名稱在我的腳本完成之前沒有得到正確的命名。我找到了臨時名稱並將其添加到我的腳本中。現在它可以工作。但是,由於您的答案適用於99%的開放應用程序,並且真的有助於我想要做的其他事情,我會將其標記爲正確! – TXP

+0

並感謝您的答覆ForegroundColor小費!總是在學習...... – TXP