Powershell auslesen

  • Hi,

    ich lese eine Powershell aus und möchte diese in meiner Gui live abbilden. bzw den Inhalt darstellen.
    Folgendes Script benutzte ich:

    [autoit]


    Func _PowerShell_Command($sCommand)
    Local $iPID = Run(StringFormat('"%s" "%s"', 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe', $sCommand), @ScriptDir, @SW_HIDE, 0x2)
    Local $sOut

    [/autoit][autoit][/autoit][autoit]

    Do
    $sOut &= StdoutRead($iPID)
    Guictrlsetdata($test,$sOut) ;auslesen und in mein Inputfeld
    sleep(500)

    [/autoit][autoit][/autoit][autoit]

    Until @error

    [/autoit][autoit][/autoit][autoit]

    StdioClose($iPID)

    [/autoit][autoit][/autoit][autoit]

    Return $sOut
    EndFunc ;==>_PowerShell_Command

    [/autoit][autoit][/autoit][autoit][/autoit]

    Problematik ist nur, dass die Powershell offen bleibt und auf Eingabe wartet, was bedeutet, dass der die Ganze Zeit liest und somit die ganze Zeit in der Do-Schleife hängt, was meine Ganze GUI lahmlegt. Jemand ne Idee?

    Grüße

  • Füge einfach nach Zeile 6. folgendes ein:

    AutoIt
    If @error Then ExitLoop


    Die Endbedingung für die Do Schleife ist bei dir, dass Sleep() einen @Error wert setzt und das hat es (zumindest bei mir) noch nie getan :D

    Edit:

    oder verändere die Schleife folgendermaßen:

    AutoIt
    Do
    	Guictrlsetdata($test,$sOut) ;auslesen und in mein Inputfeld
    	sleep(500)
    	$sOut &= StdoutRead($iPID)
    Until @error

    sollte den selben Effekt haben.

  • stimmt, das macht keinen sinn.

    bringt mir aber auch nichts, da die powershell keinen @error zurückgibt, weil sie sich nicht schließt.

    der liest ja bis es nichts mehr zu lesen gibt, da es aber immer was zu lesen gibt, is das ding immer in der do-schleife und somit hängt die GUI durch.

  • Vielleicht ein Timeout oder so?

    Wenn seit 2-3 Sekunden nichts neues mehr reinkommt bricht es ab.

    Ansonsten, was für ein Wert hat bei dir denn $sCommand, wenn ich es mit $sCommand="Tree D:\" laufen lasse scheint bei mir alles zu klappen.

  • $sCommand ist bei mir ein .ps1 script was aktiv bleibt.

    dein Tree D:\ wird executed und ist dann aus, daher geht es.

    sagen wir mal du hastn $sCommand= Tree D:\ was nie aufhört aufzulisten...dann weil der inhalt sich immer ändert... dann hängt bei dir auch die gui durch

  • jop damit gehts...

    [autoit]

    Func _PowerShell_Command($sCommand)
    global $iPID = Run(StringFormat('"%s" "%s"', 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe', $sCommand), @ScriptDir, @SW_Hide, 0x2)
    EndFunc ;==>_PowerShell_Command

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func check()
    if ProcessExists("powershell.exe") then
    global $sOut
    $sOut &= StdoutRead($iPID)
    if GUICtrlRead($test) <> $sOut then
    GUICtrlSetData($test, $sOut)
    Endif
    Endif

    [/autoit]

    Andere Frage, wenn das Fenster "hidden" ist, kann ich irgendwie über die PID einen String übergeben? bzw. Tasteneingaben?
    Also nicht über Control sondern wirklich über die PID

    • Offizieller Beitrag

    Hallo,

    das geht mit StdinWrite und dem Parameter $STDIN_CHILD.
    Damit Powershell die Befehl von der Standardeingabe liest muss Powershell mit -Command - aufgerufen werden. Wichtig ist das Minus hinter -Command!!!

  • Hallo Bernd,

    dank dir ! scheint soweit zu funktionieren, jedoch weiß ich nicht wie ich beim starten der Powershell gleichzeitig eine .ps1 Datei aufrufe.
    Daher habe ich es mit StdinWrite versucht, jedoch ohne erfolg.

    Eine Idee?

    Danke !

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $PID = Run(@SystemDir & "\WindowsPowerShell\v1.0\powershell.exe -NoLogo -Command -", @SystemDir, @SW_SHOW, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)

    [/autoit] [autoit][/autoit] [autoit]

    StdinWrite($PID,".\" &@ScriptDir & "\script1.ps1 " & "58444" & " 1431047" & " Password" &@crlf)
    ;StdinWrite($PID, "exit" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    $szOut = ""
    While 1
    $szOut &= StdoutRead($PID)
    ConsoleWrite($szOut & @CRLF)
    if @error Then ExitLoop

    [/autoit] [autoit][/autoit] [autoit]

    sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite($szOut & @CRLF)

    [/autoit]
    • Offizieller Beitrag

    Hallo,

    das sollte mit dem Paramter -File <Dateipfad> <Argumente> funktionieren!

    AutoIt
    Run(@SystemDir & "\WindowsPowerShell\v1.0\powershell.exe -NoLogo -File " & @ScriptDir & "\script1.ps1 " & "58444" & " 1431047" & " Password", @SystemDir, @SW_SHOW)
  • Hallo,

    das geht mit StdinWrite und dem Parameter $STDIN_CHILD.
    Damit Powershell die Befehl von der Standardeingabe liest muss Powershell mit -Command - aufgerufen werden. Wichtig ist das Minus hinter -Command!!!


    Danke! Ich habe 2h Stunden probiert und getestet bis ich den Beitrag gefunden habe - das war der entscheidende Hinweis!
    Projekt gerettet!