PowerShell Fenster bei Ausführung unterdrücken
Hallo zusammen,
ich habe mir mal ein kurzes Skript in PowerShell geschrieben, um Dateien ein wenig zu bearbeiten. Was genau das Skript macht ist eigentlich nicht wichtig...
Um das Ausführen des Skripts benutzerfreundlicher zu machen, habe ich im regedit zum Kontextmenü für Dateien einen Button hinzugefügt, der wenn ich diesen klicke das Skript mit 2 Argumenten ausführt. Dazu habe ich unter dem command-Schlüssel in der Zeichenfolge (Standard) folgenden Wert festgelegt:
"[Pfad der powershell.exe Datei]" -File "[Pfad des Skripts]" "[Argument1]" "[Argument2]"
Es funktioniert auch alles wunderbar, jedoch kommt jedes mal wenn ich auf den Kontextmenü Button klicke ein nerviges blaues Fenster. Ich denke das hängt mit dem Start von PowerShell zusammen, man sieht auch kurz die Befehle des Skripts durchflitzen, was jetzt nicht stört, da das Skript sowieso fast ein Einzeiler ist, das Fenster im gesamten nervt jedoch schon .
Interessant ist, wenn ich denselben Befehl (Wert des command-Schlüssels) in die CMD eingebe, dann wird das Skript ausgeführt ohne dieses Fenster (ich denke weil die CMD ja dann das PowerShell Fenster ist, da wenn man PowerShell über die CMD startet öffnet sich auch kein extra Fenster, sondern PS läuft dann über die CMD).
Ich habe schon bei meinen Suchen im Netz ein paar Beiträge gefunden, bei einem davon war die Lösung das Skript einfach via Batch-Datei auszuführen, was ich jedoch nicht sehr elegant finde.... Auch folgenden Befehl einfach ans Anfang des Skripts zu kopieren hilft nicht, da er das PowerShell-Fenster schließt wenn man es mit diesem ausführt, jedoch wird mir beim ausführen des Skripts über das Kontextmenü trotzdem das Fenster angezeigt, da ich ja PowerShell auch dafür erstmal starten muss:
$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)
Kann ich meinem Wert für den command-Schlüssel noch irgendwie Argumente mitgeben um diesen PowerShell-Start unsichtbar zu machen? Habe es schon probiert mit:
"[Pfad der powershell.exe Datei]" -WindowsStyle Hidden -File "[Pfad des Skripts]" "[Argument1]" "[Argument2]"
"[Pfad der powershell.exe Datei]" -ExecutionPolicy Bypass -File "[Pfad des Skripts]" "[Argument1]" "[Argument2]"
da ich diese Befehle auch gelesen hatte. Auch dies war aber leider Erfolglos....
Vielen lieben Dank schonmal im Voraus,
Micha
ich habe mir mal ein kurzes Skript in PowerShell geschrieben, um Dateien ein wenig zu bearbeiten. Was genau das Skript macht ist eigentlich nicht wichtig...
Um das Ausführen des Skripts benutzerfreundlicher zu machen, habe ich im regedit zum Kontextmenü für Dateien einen Button hinzugefügt, der wenn ich diesen klicke das Skript mit 2 Argumenten ausführt. Dazu habe ich unter dem command-Schlüssel in der Zeichenfolge (Standard) folgenden Wert festgelegt:
"[Pfad der powershell.exe Datei]" -File "[Pfad des Skripts]" "[Argument1]" "[Argument2]"
Es funktioniert auch alles wunderbar, jedoch kommt jedes mal wenn ich auf den Kontextmenü Button klicke ein nerviges blaues Fenster. Ich denke das hängt mit dem Start von PowerShell zusammen, man sieht auch kurz die Befehle des Skripts durchflitzen, was jetzt nicht stört, da das Skript sowieso fast ein Einzeiler ist, das Fenster im gesamten nervt jedoch schon .
Interessant ist, wenn ich denselben Befehl (Wert des command-Schlüssels) in die CMD eingebe, dann wird das Skript ausgeführt ohne dieses Fenster (ich denke weil die CMD ja dann das PowerShell Fenster ist, da wenn man PowerShell über die CMD startet öffnet sich auch kein extra Fenster, sondern PS läuft dann über die CMD).
Ich habe schon bei meinen Suchen im Netz ein paar Beiträge gefunden, bei einem davon war die Lösung das Skript einfach via Batch-Datei auszuführen, was ich jedoch nicht sehr elegant finde.... Auch folgenden Befehl einfach ans Anfang des Skripts zu kopieren hilft nicht, da er das PowerShell-Fenster schließt wenn man es mit diesem ausführt, jedoch wird mir beim ausführen des Skripts über das Kontextmenü trotzdem das Fenster angezeigt, da ich ja PowerShell auch dafür erstmal starten muss:
$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)
Kann ich meinem Wert für den command-Schlüssel noch irgendwie Argumente mitgeben um diesen PowerShell-Start unsichtbar zu machen? Habe es schon probiert mit:
"[Pfad der powershell.exe Datei]" -WindowsStyle Hidden -File "[Pfad des Skripts]" "[Argument1]" "[Argument2]"
"[Pfad der powershell.exe Datei]" -ExecutionPolicy Bypass -File "[Pfad des Skripts]" "[Argument1]" "[Argument2]"
da ich diese Befehle auch gelesen hatte. Auch dies war aber leider Erfolglos....
Vielen lieben Dank schonmal im Voraus,
Micha
Please also mark the comments that contributed to the solution of the article
Content-ID: 3626552062
Url: https://administrator.de/contentid/3626552062
Printed on: September 14, 2024 at 10:09 o'clock
10 Comments
Latest comment
Zum komplett unsichtbar starten (also auch ohne kurzes Aufblitzen des CMD-Fensters) musst du z.B. ein VBS Schnippsel bemühen um das PS Skript auszuführen
Und dann das VBS ausführen mit
Als Alternative, das Skript als EXE mit Wrapper kompilieren.
CreateObject("Wscript.Shell").Run "powershell -EP Bypass -File ""D:\script.ps1""",0,false
cscript //NOLOGO "C:\Pfad\zum\vbsschnippsel.vbs"
-WindowsStyle Hidden
Das verhindert zwar das das Fenster später unsichtbar ist, aber das kurze Aufblitzen der CMD verhindert es trotzdem nicht.Zitat von @michi.wtr:
Das hört sich schonmal gut an, kenne mich mit VBS nur leider gar nicht aus und wollte es wie gesagt vermeiden, da ich das ein wenig unsexy finde ^^.
Geht aber leider nicht anders. Der "powershell" Befehl ist nunmal ein CMD-Befehl und triggert zwangsweise kurz die CMD wenn man sie nicht vorher durch andere Maßnahmen ausblendet. Das gleiche kann auch ein kleines c# Programm erledigen das per "Process"-Object den ganzen Prozess auf unsichtbar schaltet. Mit was du das programmierst ist eigentlich egal VBS ist nur ein Beispiel.Das hört sich schonmal gut an, kenne mich mit VBS nur leider gar nicht aus und wollte es wie gesagt vermeiden, da ich das ein wenig unsexy finde ^^.
Bei deiner Zeile sind 0 und false die übergebenen Parameter, oder sind das tatsächlich auch notwendige Befehle um kein Fenster anzuzeigen (ist ja bei beidem nicht ganz abwegig :D)
die 0 ist für das Ausblenden des Fensters verantwortlich und das false, bedeutet warte nicht auf Beendigung des Skriptes, hier steht das auch alleshttps://ss64.com/vb/run.html
Zitat von @michi.wtr:
Hab schon bisschen rumprobiert mit dem VBS, aber müsste noch meine ps1 Datei bisschen umändern um das zu testen, die übergebenen Parameter wie Pfad der Datei übergebe ich dann nach dem String mit dem Pfad der .ps1 Datei nehme ich an?
Ja.Hab schon bisschen rumprobiert mit dem VBS, aber müsste noch meine ps1 Datei bisschen umändern um das zu testen, die übergebenen Parameter wie Pfad der Datei übergebe ich dann nach dem String mit dem Pfad der .ps1 Datei nehme ich an?
Bzw. muss ich demnach auch das VBS mit Parametern starten, das funktioniert auf dieselbe Weise wie mit PowerShell nehme ich an? Also nach ...vbs" "[Parameter1]" ?
ja. Innerhalb der VBS kommst du mitWScript.Arguments(0)
bsp.
CreateObject("Wscript.Shell").Run "powershell -EP Bypass -File ""D:\script.ps1"" -Param1 " & wscript.arguments(0),0,false
cscript //NOLOGO C:\Pfad\script.vbs "Argument1"
Wenn Strings mit Leerzeichen als Parameter vorhanden sind dann natürlich im VBS den Parameter noch mit zusätzlichen Anführungszeichen versehen.
Habe ich ja oben bereits darauf hingewiesen du musst zusätzliche Anführungszeichen im VBS hinzufügen genauso wie ich es beim PS1 Pfad gemacht habe (daran denken sie zu verdoppeln da sie schon innerhlab von Anführungszeichen stehen).
VBS (Zum Testen sichtbar geschaltet mit 1 statt 0 und zusätzlich -NoExit damit die PS Konsole offen bleibt)
PS
Aufruf
Ergebnis wie erwartet:
CreateObject("wscript.shell").Run "powershell -EP Bypass -NoExit -File ""c:\temp pfad\test.ps1"" -param1 """ & wscript.arguments(0) & """ -param2 """ & wscript.arguments(1) & """",1,false
PS
param(
[string]$param1,
[string]$param2
)
write-host "Param1: $param1"
write-host "Param2: $param2"
Aufruf
cscript //NOLOGO "C:\temp pfad\test.vbs" "Text für Parameter 1" "Text für Parameter 2"
Ergebnis wie erwartet: