none
Powershell Fenster unterdrücken

    Frage

  • Hallo an Alle

    Leider habe ich auf meine Frage bis jetzt keine funktionierende Antwort gefunden oder aber ich bin zu blöd die Puzzleteile zusammen zu setzen.

    Ich habe eine Batch Datei erstellt, in der ich unter anderem mehrere Powershell Script starte.

    Dazwischen hat es immer noch andere Befehle die in der Reihenfolge ausgeführt warden sollen.

    Nun erscheint aber bei jedem Start eines der Powershell Scripts ein blaues Fenster und zeigt was er da so abarbeitet.

    Das interessiert den User nicht resp. verwirrt diesen nur.

    Also sollen diese Fenster nicht angezeigt warden resp. unterdrückt werden.

    Aber wie?

    Das Powershell Script rufe ich mit folgendem Befehl auf.

    PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\Test.ps1""'}"

    Danke für jeden Tipp

    Trix

    Freitag, 29. März 2019 06:38

Antworten

  • Hallo Trix,

    ich würde Dir empfehlen, die Hilfe für die Powershell.exe mal genau zu studieren! ;-) Also einfach mal auf der Kommandozeile "Powershell.exe /?" eingeben und die Hilfe komplett lesen. Besonders die Option -WindowStyle sollte für Dich interessant sein.  

    Aber wenn Du sowieso schon mit der Powershell arbeitest, warum dann überhaupt noch CMD/Batch? ;-)

    Wenn Du das Fenster komplett verstecken möchtest, wirst Du tricksen müssen. Es gibt die Möglichkeit mittels einer VBScript-Datei die Powershell völlig "hidden" zu starten. Such einfach mal danach.

    Das Umleiten der Ausgaben in eine Datei, wie es Jakša empfiehlt, würde übrigens nur die Ausgaben verstecken. Die Befehle sind trotzdem noch beim "Durchrauschen" zu beobachten.

    Eine weitere Möglichkeit wäre es, die Scripte in einem anderen Kontext mittels Aufgabenplanung zu starten. Dann ist gar kein Fenster zu sehen.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''


    Freitag, 29. März 2019 08:00
  •  

    Noch als Ergänzung, hiermit kann man die Console (oder jedes beliebige andere Fenster) im Script selbst verschwinden lassen, wenn man den Aufruf nicht beeinflussen kann oder will:
     

    $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) 
    

     
    Einfach an den Anfang des Scripts kopieren. 
    Grüße, Denniver

     

    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Freitag, 29. März 2019 09:56
    Moderator

Alle Antworten

  • Hi,

    eine ganz doofe Frage: warum rufst Du das Script nicht direkt auf: PowerShell  -NoProfile -ExecutionPolicy Bypass -File "C:\Test.ps1"?

    Dann könntest Du die Ausgabe in eine Datei umleiten, es wird nichts angezeigt und Du hättest auch ein Protokoll über den Output.


    Freitag, 29. März 2019 07:06
  • ok Danke für den Hinweis.

    Ich brauche diese Powershell Script an verschiedenen Orten.

    so hab ich einfach den Aufruf kopiert ohne weiter darüber nachzudenken.

    Was meinst Du mit "Ausgabe in eine Datei umleiten"? Wie?

    Freitag, 29. März 2019 07:26
  • Hallo Trix,

    ich würde Dir empfehlen, die Hilfe für die Powershell.exe mal genau zu studieren! ;-) Also einfach mal auf der Kommandozeile "Powershell.exe /?" eingeben und die Hilfe komplett lesen. Besonders die Option -WindowStyle sollte für Dich interessant sein.  

    Aber wenn Du sowieso schon mit der Powershell arbeitest, warum dann überhaupt noch CMD/Batch? ;-)

    Wenn Du das Fenster komplett verstecken möchtest, wirst Du tricksen müssen. Es gibt die Möglichkeit mittels einer VBScript-Datei die Powershell völlig "hidden" zu starten. Such einfach mal danach.

    Das Umleiten der Ausgaben in eine Datei, wie es Jakša empfiehlt, würde übrigens nur die Ausgaben verstecken. Die Befehle sind trotzdem noch beim "Durchrauschen" zu beobachten.

    Eine weitere Möglichkeit wäre es, die Scripte in einem anderen Kontext mittels Aufgabenplanung zu starten. Dann ist gar kein Fenster zu sehen.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''


    Freitag, 29. März 2019 08:00
  • Danke für Deine Antwort

    ich habe inzwischen rumgepröbelt und die Lösung gefunden.

    Mit dem Aufruf des Scripts via

    PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""C:\Test.ps1""'}"

    hat -WindowStyle Hidden nicht funktioniert.

    allerdings mit dem vereinfachten Aufruf

    PowerShell  -NoProfile -ExecutionPolicy Bypass -File "C:\Test.ps1" schon

    Also: PowerShell  -NoProfile -ExecutionPolicy Bypass -File "C:\Test.ps1" - WindowsStyle Hidden

    Die CDM ist notwendig, oder zumindest für mich notwendig. Ich kenne mich mit PowerShell zu wenig aus und so ist es für mich einfacher.

    Der Hintergrund der ganzen Geschichte ist, dass ich beim Erststart eines Users auf irgendeinem PC ein CMD laufen lasse, das mir das UserProfil bei der Erstellung etwas zurecht biegt.

    Jetzt funktioniert das genau so wie es soll.

    Danke Euch allen für den Denkanstoss und die Hinweise.

    Trix

    Freitag, 29. März 2019 09:16
  •  

    Noch als Ergänzung, hiermit kann man die Console (oder jedes beliebige andere Fenster) im Script selbst verschwinden lassen, wenn man den Aufruf nicht beeinflussen kann oder will:
     

    $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) 
    

     
    Einfach an den Anfang des Scripts kopieren. 
    Grüße, Denniver

     

    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Freitag, 29. März 2019 09:56
    Moderator
  • Hi,

    "Das Umleiten der Ausgaben in eine Datei, wie es Jakša empfiehlt, würde übrigens nur die Ausgaben verstecken. Die Befehle sind trotzdem noch beim "Durchrauschen" zu beobachten."

    Nö, sind sie nicht.

    Habe es explicit noch mal getestet.

    Ein Powershell Script (psscript.ps1) mit folgendem Inhalt:

    cd \
    dir
    Start-sleep 3
    ps | ft

    Dieses Script wird aus einer Batch (test.cmd) gestartet und die Ausgabe umgeleitet:

    @echo off
    echo [START]
    PowerShell  -NoProfile -ExecutionPolicy Bypass -File "psscript.ps1" > ausgabe.txt
    echo [END]

    Das ist die Ausgabe:

    C:\Projekte>test
    [START]
    [END]
    
    C:\Projekte>

    Also, da sind keine Powershell Fester zu sehen, und auch keine Befehle die "durchrauschen". Du findest zum Schluss eine Datei (ausgabe.txt) dort findest Du dann den Output des PS Scripts.

    Grüße und schönes Wochenende,

    Jakša



    Samstag, 30. März 2019 13:52
  • Jakša,

    ich hatte es zwar anders verstanden als Du es meintest - ich dachte, Du wolltest die Ausgabe der einzelnen Befehle innerhalb des Powershell-Skriptes in eine Datei umleiten - aber Du hast Recht. Da ist keine Ausgabe der Befehle zu sehen.

    Komisch, irgendwie hab ich das schon mal anders gesehen ... naja, was soll's. Wieder was dazugelernt. ;-)


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Samstag, 30. März 2019 15:08