Poweshellscript fenster unsichtbar einbinden

  • Hallo liebe Scripter,

    es gibt in cmd den Befehl mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'file.ps1'"""""", 0 : window.close"), der es ermöglicht ein PS Script auzurufen, und das Fenster dabei komplett unsichtbar zu halten. Ich gehe mal jetzt nicht davon aus, dass es dafür auch eine Funktion in AI gibt, ich habe es folgendermaßen versucht, erhalte dann aber nur ein WS Scriptfehler:

    RunWait('mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& ""C:\Users\user\Desktop\PS_Mit_GUI\script.ps1""")', "", @SW_SHOW)

    Was ist an diesem Ausdruck falsch?

    Habe es auch so versucht

    Run("powershell.exe -ExecutionPolicy Bypass -Command Start-Process C:\Users\user\Desktop\PS_Mit_GUI\script.ps1 -NoNewWindow -Wait")

    Hier wird das Fenster aber kurz gezeigt

    Vielleicht hat jemand ne Idee

    LG und schöne Restwoche noch :rock:

  • Also du willst, das das Fenster nicht angezeigt wird?

    @SW_HIDE wird dir dabei helfen:

    Run("powershell.exe -ExecutionPolicy Bypass -Command Start-Process C:\Users\user\Desktop\PS_Mit_GUI\script.ps1 -NoNewWindow -Wait", '', @SW_HIDE)

    Schaue dir bitte eindringlich nochmal die Hilfe an, das steht da drin (show_flag)! https://www.autoitscript.com/autoit3/docs/functions/Run.htm

    Willst du es aber wirklch "Einbinden" wird es komplizierter, da du aber von unsichtbar redest, würde das Einbinden keinen Sinn ergeben.

    Einmal editiert, zuletzt von Moombas (26. Januar 2023 um 13:49)

  • Mal ein anderes Bsp.:

  • ji Hallo Mombi, danke, dass hatte ich schon probiert, das funktioniert deshalb nicht, da in dem PS ein Grid geöffnet wird, und dieses soll er anzeigen, sorry, hatte ich vielleicht sagen sollen. BugFix, dein Beispiel scheu ich mir mal an

    lg und schönen Abend noch

  • klingt erst mal gut, aber dass was ich geschrieben hatte war ja erst mal ein WScriptaufruf, um ein PS Script ohne Hauptfenster zu öffnen. Aber mal schauen vielleicht kann ich das Script ja in deinen Code einbauen.

    lg und schönen Abend noch

  • Na dann denke ich dann muss ich wohl doch den uneleganten Weg beschreiten und eine Verknüpfung erstellen, die ich dann aufrufe. Aas Problem, meines Wissens gibt es keinen PC Code der vorangestellt im PS Script, das vollständige Vestecken des PS Fensters erzwingt, deshalb ja der WSScript Aufruf;)

    lg

  • ji Hallo Mombi, danke, dass hatte ich schon probiert, das funktioniert deshalb nicht, da in dem PS ein Grid geöffnet wird, und dieses soll er anzeigen, sorry, hatte ich vielleicht sagen sollen. BugFix, dein Beispiel scheu ich mir mal an

    lg und schönen Abend noch

    Ok, also erst nicht anzeigen und dann, wenn er quasi alle Daten hat, Anzeigen?

    Hast du eine ~Zeitangabe wie lange das erzeugen dauert (oder besser: irgendeinen Indikator auf den du schauen kannst wann es erzeugt wurde)?

    Du könntest dann mit @SW_HIDE starten und dann nach z.B. 2 Sekunden erst das Fenster per WinSetState() anzeigen:

    Keine Gewähr auf komplett korrekt, da nur kurz zusammen gezimmert ;)

    Edit: Wobei die Lösung von Bugfix natürlich zu bevorzugen wäre.

    Einmal editiert, zuletzt von Moombas (27. Januar 2023 um 11:02)

  • Man braucht im Zweifel auch keine Verknüpfung. Wenn das ganze aus dem CMD Fenster läuft .... benutze doch einfach eine "altmodische" *.bat Datei. Den CMD Befehl rein bat ausführen - fertig.

    So long

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Na dann denke ich dann muss ich wohl doch den uneleganten Weg beschreiten und eine Verknüpfung erstellen, die ich dann aufrufe. Aas Problem, meines Wissens gibt es keinen PC Code der vorangestellt im PS Script, das vollständige Vestecken des PS Fensters erzwingt, deshalb ja der WSScript Aufruf;)

    Verstehe ich nicht.

    Wenn du den PS-Code aus deiner vorhandenen .ps1 von meiner Funktion ausführen lässt (alternativ diese umschreibst zur Übernahme deiner existierenden .ps1), dann läuft alles im Hintergrund ab und das Ergebnis landet in einer von dir festgelegten Textdatei zum Auslesen. Du kannst auch noch ergänzen, dass diese Ergebnisdatei automatisch von deinem Standardeditor nach Fertigstellung geöffnet wird.

  • Habe es jetzt mal mit ein paar mehr Zeilen versucht, irgendwie scheint er Probleme mit Anführungszeichen zu haben, wie zB bei Delimiter oder an der Stelle '[DllImport("user32.dll")]' & _ . Wie ist bei sowas vorzugehen?

    Mein Ausdruck sieht wie folgt aus:

    AutoIt
    Global $sCmdPS = _
    '$window = Add-Type -memberDefinition @"' & _
    '[DllImport("user32.dll")]' & _
    'public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);' & _
    '"@ -name "Win32ShowWindowAsync" -namespace Win32Functions -passThru' & _
    '$window::ShowWindow((Get-Process –id $pid).MainWindowHandle, 0)' & _
    '$objcsv = Import-Csv c:\user.csv -Encoding Default -delimiter ";"' & _
    '$objcsv | out-gridview'

    Beste Grüße und gute Nacht

  • Probier doch mal Filewrite und schreib den Ausdruck in eine *.txt, da sollte man dannn sehen wo die Anführungszeichen übergeben werden

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Na dass hatte ich ja schon gemacht, dass schaut dann so aus

    $window = Add-Type -memberDefinition @" [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); "@ -name "Win32ShowWindowAsync" -namespace Win32Functions -passThru $window::ShowWindow((Get-Process –id $pid).MainWindowHandle, 0) $objcsv = Import-Csv c:\user.csv -Encoding Default -delimiter ";" $objcsv | out-gridview

    Aber denke mal die Funktion geht nur bei klassischen OneLinern

    lg und schönen Abend noch

  • Das kann ja so nicht funktionieren casi4712 :

    Kleines Beispiel ohne weiter zu schauen:

    $window = Add-Type -memberDefinition @" [DllImport("user32.dll")] pub...

    Das erste " und das zweite " fassen folgendes ein: [DllImport( und das ist nicht, das was du erreichen willst.

    Ersetze die inneren " mit ' Also:

    Code
    $window = Add-Type -memberDefinition @" [DllImport('user32.dll')] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); "@ -name "Win32ShowWindowAsync" -namespace Win32Functions -passThru $window::ShowWindow((Get-Process –id $pid).MainWindowHandle, 0) $objcsv = Import-Csv c:\user.csv -Encoding Default -delimiter ";" $objcsv | out-gridview

    Das hat zur Folge, das dein Code sich auch ändern muss:

    AutoIt
    Global $sCmdPS = _
    '$window = Add-Type -memberDefinition @"' & _
    "[DllImport('user32.dll')]" & _
    'public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);' & _
    '"@ -name "Win32ShowWindowAsync" -namespace Win32Functions -passThru' & _
    '$window::ShowWindow((Get-Process –id $pid).MainWindowHandle, 0)' & _
    '$objcsv = Import-Csv c:\user.csv -Encoding Default -delimiter ";"' & _
    '$objcsv | out-gridview'
  • hallo Moomnas,

    hatte erst kürzlich gesehen dass Du noch geschrieben hattest, aber dass hatte so noch nicht funktioniert, hätte bei Dir eigentlich auch so nicht gehen dürfen. Das Problem war folgendes, erstens störete das 0x2, was auch immer das machen soll in der folgenden Zeile.

    Code
        Local $sOut = '', $iPID = Run($sRun, @ScriptDir, @SW_HIDE, 0x2)

    Und weiterhin kann es aus powershell technischen Gründen ja nicht funktionieren, am ende einer abgeschlossenen PS Zeile erwartet PS ja ein ; zur Trennung, und das von Bug vorgeschlagene Script schreibt ja alles in ein File in eine Zeile, dann geht es. Also bspw. so:

    AutoIt
    Global $EnvPath = '"c:\code"'
    Global $sCmdPS = _
        '[System.Environment]::GetEnvironmentVariable("PATH","machine") > C:\backup-path.txt;' & _
        '$INCLUDE = ' & $EnvPath & ';' & _
        '$OLDPATH = [System.Environment]::GetEnvironmentVariable("PATH","machine");' & _
        '$NEWPATH = "$OLDPATH;$INCLUDE";' & _
        '[Environment]::SetEnvironmentVariable("PATH", "$NEWPATH", "Machine")'
    _PowerShell_Run($sCmdPS)

    Vielen Dank hier noch an allen Helfern und eine

    schöne Woche

  • casi4712 , das mit dem 0x2 habe ich in keinem meiner Codes verwendet, das kommt von BugFix und wenn du dir die Hilfe anschauen würdest, dann wüsstest du das dies $STDOUT_CHILD ist im opt_flag des run Befehls...

    Die Powershellzeilen habe ich 1:1 von dir hier übernommen (Beitrag 13) und natürlich nicht geprüft, da ich zum einen nicht PS affin bin und zum anderen du dies schon vorher selber prüfen musst. Das Einzige, was ich geändert habe ist die Zeile bzgl. der ' und " in diesem Block (vergleich mal deinen Block aus #13 und meinen Block aus #16).