PowerShell srcipt von Autoscript

  • Ich möchte ein winziges PowerShell script von Autoit aus aufrufen. Das klappt auch ganz gut, leider bekomme ich keine Returnwerte von PowerShell Script. Kann mir da jemand einen Tipp geben.

    So sieht mein Autoscript aus:

    Local $X = Runwait("powershell.exe d:\Wilfried\Desktop\mod.ps1", "", @SW_Maximize)

    Msgbox(0,"Test",$X)

    und so mein PowerShell sript:

    $Sessions = Get-smbsession

    if ($sessions) {

    write-host "Sessions found"

    return (1)

    }

    else {

    write-host "No sessions found"

    return (0)

    }

    Leider wird immer 0 zurückgegeben, egal ob eine Verbindung gefunden wurde oder nicht.

  • Funktioniert denn dein PS Skript in der PS-Shell?

    Hier ein Bsp. aus einem anderen Thread, wie man PS in AutoIt ausführen kann.

  • Hi quasimodoz ,

    BugFix hat dir bereits eine Variante aufgezeigt, wie du Powershell in AutoIt nutzen kannst bzw. wie du mit dem Output umgehen kannst.

    Hier mal noch eine weitere, über die Zwischenablage:

    • Ich gehe hier davon aus, dass powershell in den Umgebungsvariablen zu finden ist.
    • Desweiteren wird auf Abschluss des Powershell Aufrufs gewartet => ShellExecuteWait.
    • Danach ist das Ergebnis in der Zwischenablage und von dort kannst du ja machen was du willst 😅 .

    Oftmals transformiere ich das Ergebnis in ein Array und von dort geht es dann weiter, je nach Bedarf.
    Hilfreich kann auch sein, wenn du noch vor | Set-Clipboard ein Konvertierungs-Commandlet setzt wie bspw. ConvertTo-Json oder ConvertTo-Csv (Html, Xml) etc.

    Get-Process | Select-Object -Property Id, ProcessName | ConvertTo-Json | Set-Clipboard

    Update

    So oder so ähnlich (musst du anpassen), könnte dann dein PS-Code aus post #1 aussehen.

    AutoIt
    Global $sPowershellCode     = _
        '$Test = "This is a test"' & @CRLF & _
        @CRLF & _
        'if ($Test -eq "This is my test") {' & @CRLF & _
        '    1  | Set-Clipboard' & @CRLF & _
        '} else {' & @CRLF & _
        '    2 | Set-Clipboard' & @CRLF & _
        '}'


    Viele Grüße
    Sven

  • Vielen Dank für eure Anworten.

    Ja, mein kleines script fuktioniert wunderbar, wenn ich es mit Adminrechten starte.

    Ich hatte nun erwartet, dass der Aufruf direkt ein Resultat (true| false) zurückliefert. Da ist wohl nicht so und deshalb habt Ihr so schöne scripte geschrieben und damit von hinten durch die Brust ins Auge getroffen. 😀

    Dann muss ich wohl in den sauren Apfel beißen. Aber noch einmal: Besten Dank.

  • Hi quasimodoz ,

    was genau meinst du damit?

    Dann muss ich wohl in den sauren Apfel beißen.


    Dein Skript funktioniert und du kannst es mit AutoIt nutzen aber du magst nicht den Weg wie du die Rückgabewerte des PS-Skript bekommst?
    Oder was genau meinst du?

    Also kurz gesagt, brauchst du noch weitere Hilfe/Tipps/Unterstützung oder ist das Thema für dich abgeschlossen?
    Falls ja, dann kannst du es gern als solches, "erledigt", markieren 😀 .

    Viele Grüße
    Sven

  • Hallo,

    ich denke dein Aufruf ist nicht ganz korrekt. ^^

    AutoIt
    Local $X = Runwait("powershell.exe d:\Wilfried\Desktop\mod.ps1", "", @SW_Maximize)

    bitte ersetze das mal durch:

    AutoIt
    $iPID = Run("powershell.exe" & ' -ExecutionPolicy ByPass -File "d:\Wilfried\Desktop\mod.ps1"', "", @SW_Maximize, 0x2)
    ProcessWaitClose($iPID)
    ConsoleWrite(StdoutRead($iPID) & @CRLF)

    ich denke die "0" die du immer zurückbekommst sagt lediglich aus, dass dein Powershell Skript an sich ohne Fehler beendet wurde.

    Durch den Stream "0x2" = Stdout wird das Return des Skriptes selbst weitergeleitet.

    Dieses kann durch StdoutRead ausgelesen werden. (in der autoit Hilfe kannst du das unter "StdOutRead" nachlesen)

    Wenn Du nur mit 0 / 1 arbeitest, kann autoit dass auch als False / True verarbeiten.

    Achtung, autoit macht es genau andersrum wie alle anderen^^

    0 = nicht erfolgreich

    1 = erfolgreich

    :party:

    Einzig: zwischen dem Aufruf deines PS-Skript's und dem auslesen des Stdout darf kein anderer Befehl dazwischen laufen.

    Ansonsten ist der Stream verworfen und leer.

    vergleiche:

    AutoIt
    $iPID = Run("powershell.exe" & ' -ExecutionPolicy ByPass -File "C:\Users\Oliver\Desktop\PS.ps1"', "", @SW_HIDE, 0x2)
    ProcessWaitClose($iPID)
    
    ConsoleWrite(StdoutRead($iPID) & @CRLF)
    If StdoutRead($iPID) = True Then MsgBox(0, "", "juhu")

    und

    AutoIt
    $iPID = Run("powershell.exe" & ' -ExecutionPolicy ByPass -File "C:\Users\Oliver\Desktop\PS.ps1"', "", @SW_HIDE, 0x2)
    ProcessWaitClose($iPID)
    If StdoutRead($iPID) = True Then MsgBox(0, "", "juhu")
    ConsoleWrite(StdoutRead($iPID) & @CRLF)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ausführbares Script ("as is"), dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    Man möge mir verzeihen, wenn ich nicht perfekten und ideal lesbaren Code zur Verfügung stelle.
    Ich möchte Hilfe zur Selbsthilfe leisten und denke dass eine gewisse Transferleistung erwartet werden kann.

    Einmal editiert, zuletzt von Schnuffel (20. Februar 2022 um 14:33)

  • Vielen Dank für Eure Hilfe. Der Weg über die Zwischenablage scheint mir am einfachsten gangbar, obwohl es mich nach wie vor wurmt, dass nicht eine einfachere Lösung möglich ist. Ansonsten möchte ich diesen thread schließen.

    Nun bin ich kein Autoit Experte und habe nur wenige scripts geschrieben. Bei der Durchsicht der Hilfefunktion ist mir aufgefallen, dass es die _Net_Share UDFs gibt. Das scheint mir ein Ansatzpunkt zu sein, auf den Umweg über die PS verzichten zu können.

    Einmal editiert, zuletzt von quasimodoz (26. Februar 2022 um 10:44)