2017-09-07 4 views
0

Ich bin ein Starter zu PowerShell, also vielleicht ist dies eine dumme Frage.PowerShell - Schleife während MainWindowTitle nicht gefunden

Es ist ein einfaches Skript. Ich möchte ein Programm öffnen, das selbst verschiedene Fenster öffnet. Der erste ist nur ein Fenster, in dem gefragt wird, ob ich mich verbinden möchte. Mit

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

Ich bestätige nur, dass ich eine Verbindung herstellen möchten. Jetzt ist das nächste Fenster knifflig. Es dauert einige Zeit zu laden und ich kenne seine MainWindowTitle. Was ich will nicht tun, ist

Start-Sleep -Milliseconds 20000

zu schreiben, um lange genug zu warten. Manchmal ist es innerhalb weniger Sekunden geöffnet und manchmal dauert es sogar länger als 20s. Daher dachte ich, es wäre eine gute Idee, etwas in eine Schleife zu legen und darauf zu warten, dass der Prozess vollständig gestartet wird. Hier ist, was ich getan habe (und was nicht funktioniert ...):

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

Ich habe die write-host $winid das Ergebnis meiner Get-Process zu zeigen. Aber es ist NULL die ganze Zeit, auch wenn das Fenster für eine lange Zeit geöffnet ist.

Wenn ich mein Skript zu stoppen und schreiben einfach

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

es funktioniert! Weiß nicht, warum ...

Wie kann ich das Skript überprüfen, ob das benötigte Fenster geöffnet und für einige Tastenanschläge bereit ist?

Danke, Tobias

Antwort

1

Sie erwähnt das Skript, das Programm wurde öffnen. Wenn dies der Fall ist, können Sie das Prozess-Handle direkt mit Start-Process mit dem Schalter -PassThru abrufen.

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

Ein komplettes Beispiel:

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

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

Write-Host -ForegroundColor Cyan $MyProcess.MainWindowHandle 

Das ist effizienter und hat den Vorteil, wenn es möglich ist, mit diesem Titel mehrere Fenster zu haben, weil man tatsächlich den Griff aus dem Prozess verwenden Sie wissen, Sie haben begonnen .

Was Ihren spezifischen Fehler angeht, habe ich es beim Testen Ihres Skripts bekommen, bis ich vor der Weile ein $ winid = $ null gesetzt habe, um die Variable zurückzusetzen. Ich denke, wenn Sie das Skript tatsächlich aufrufen, wird $ winid jedes Mal null sein, aber wenn Sie dieses Skript über eine IDE testen, könnte die Variable zwischen der Ausführung bleiben, was bedeutet, dass sie das erste Mal funktioniert, aber niemals in die while-Schleife geht danach, weil $ winid value immer noch gesetzt wäre.

+1

Danke für Ihre Antwort! Die App, die ich öffne, erstellt im Grunde eine Remote-Verbindung. Dabei öffnet es das erste Fenster - das würde mit deinem Code funktionieren. Aber dieses Fenster wird direkt wieder geschlossen, wenn ich "connect" wähle und ich bekomme eine neue Prozess-ID. Ich fand heraus, dass der Fenstername des neuen Fensters, das ich zu fangen versuchte, irgendwie nicht korrekt benannt wurde, bis mein Skript fertig war. Ich habe den temporären Namen gefunden und in meinem Skript hinzugefügt. Jetzt funktioniert es. Aber da deine Antwort auf 99% der Eröffnungs-Apps zutrifft und wirklich hilft für andere Dinge, die ich gerne tun würde, werde ich sie als richtig markieren! – TXP

+0

Und danke für den ForegroundColor Tipp in deiner Antwort! Immer lernen... – TXP

Verwandte Themen