2017-09-07 4 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 
} 

私は私のGet-プロセスの結果を表示するwrite-host $winidを持っています。しかし、ウィンドウが長い間開いていても、全体的にNULLです。

私は私のスクリプトを停止し、単にそれが動作

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

を書きます!なぜか分からない...

必要なウィンドウが開かれ、キーストロークの準備ができているかどうかをスクリプトに確認させるにはどうすればよいですか?

おかげで、あなたはあなたのスクリプトがプログラムを開いたmentionned トビアス

答えて

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の値が設定されるためです。

+1

あなたの答えをありがとう!私が開いているアプリは、基本的にリモート接続を作成しています。これを実行すると、最初のウィンドウが開きます。これはコードで動作します。しかし、私が "connect"を選択すると、そのウィンドウが再び閉じられ、新しいプロセスIDが得られます。私は、何とかキャッチしようとしていた新しいウィンドウのウィンドウ名が、スクリプトが完了するまで正しい名前を取得していないことを知りました。一時的な名前を見つけてスクリプトに追加しました。今それは動作します。しかし、あなたの答えがアプリケーションを開くの99%に適用され、私がしたいと思っている他のもののために本当に役立つ私はそれを正しいとマークします! – TXP

+0

あなたの返信にForegroundColorのヒントありがとう!いつも学ぶ... – TXP

関連する問題