webentwicklung-frage-antwort-db.com.de

Wie führe ich ein PowerShell-Skript aus, ohne ein Fenster anzuzeigen?

Wie ist es möglich, ein PowerShell Skript auszuführen, ohne dem Benutzer ein Fenster oder ein anderes Zeichen anzuzeigen?

Mit anderen Worten, das Skript sollte im Hintergrund ohne Anzeichen für den Benutzer ausgeführt werden.

Extra Gutschrift für eine Antwort, die keine Komponenten von Drittanbietern verwendet :)

107
Thomas Bratt

Sie können es entweder so ausführen (aber dies zeigt ein Fenster für eine Weile):

PowerShell.exe -windowstyle hidden { your script.. }

Oder Sie verwenden eine Hilfedatei, die ich erstellt habe, um das Fenster PsRun.exe zu umgehen, das genau das tut. Sie können die Quell- und Exe-Datei herunterladen Geplante Aufgaben mit der WinForm-Benutzeroberfläche in PowerShell ausführen . Ich benutze es für geplante Aufgaben.

Bearbeitet: Wie Marco bemerkte, ist dieser Parameter -windowstyle nur für V2 verfügbar.

111
stej

Sie können die PowerShell Community Extensions verwenden und dies tun:

start-process PowerShell.exe -arg $pwd\foo.ps1 -WindowStyle Hidden

Sie können dies auch mit VBScript tun: http://blog.sapien.com/index.php/2006/12/26/more-fun-with-scheduled-powershell/

(Via dieser Forenthread .)

17
ax.

Hier ist ein Ansatz, der keine Befehlszeilenargumente oder einen separaten Starter erfordert. Es ist nicht vollständig unsichtbar, da ein Fenster beim Start vorübergehend angezeigt wird. Aber es verschwindet dann schnell. Wenn das in Ordnung ist, ist dies meiner Meinung nach der einfachste Ansatz, wenn Sie Ihr Skript durch Doppelklicken im Explorer oder über eine Verknüpfung im Startmenü (einschließlich natürlich des Untermenüs Start) starten möchten. Und ich mag, dass es Teil des Codes des Skripts selbst ist, nicht etwas Äußeres.

Schreiben Sie dies vor Ihr Skript:

$t = '[DllImport("user32.dll")] public static extern bool ShowWindow(int handle, int state);'
add-type -name win -member $t -namespace native
[native.win]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle, 0)
13
Andy Lowry

Ich hatte das gleiche Problem. Ich habe herausgefunden, ob Sie zu Task in Task Scheduler gehen, in dem das Skript powershell.exe ausgeführt wird. Sie können auf "Führen Sie aus, ob der Benutzer angemeldet ist oder nicht "und das Powershell-Fenster wird bei Ausführung der Aufgabe nie angezeigt.

11
Yusha

Ich hatte dieses Problem beim Ausführen von c # unter Windows 7, als der Dienst "Interactive Services Detection" beim Ausführen eines versteckten Powershell-Fensters als SYSTEM-Konto angezeigt wurde.

Durch die Verwendung des Parameters "CreateNoWindow" wurde verhindert, dass der ISD-Dienst seine Warnung anzeigt.

process.StartInfo = new ProcessStartInfo("powershell.exe",
    String.Format(@" -NoProfile -ExecutionPolicy unrestricted -encodedCommand ""{0}""",encodedCommand))
{
   WorkingDirectory = executablePath,
   UseShellExecute = false,
   CreateNoWindow = true
};
5
jmc

Ich denke, die beste Möglichkeit, den Konsolenbildschirm der PowerShell auszublenden, wenn Sie ein Hintergrundskript ausführen, ist dieser Code (" Bluecakes " answer).

Ich füge diesen Code am Anfang aller meiner PowerShell-Skripts ein, die ich im Hintergrund ausführen muss.

# .Net methods for hiding/showing the console in the background
Add-Type -Name Window -Namespace Console -MemberDefinition '
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();

[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'
function Hide-Console
{
    $consolePtr = [Console.Window]::GetConsoleWindow()
    #0 hide
    [Console.Window]::ShowWindow($consolePtr, 0)
}
Hide-Console

Wenn Ihnen diese Antwort weitergeholfen hat, stimmen Sie bitte mit "Bluecakes" in seiner Antwort in diesem Beitrag.

5
gavraham

Hier ist ein Einzeiler:

mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'C:\Example Path That Has Spaces\My Script.ps1'"""""", 0 : window.close")

Dies kann zwar dazu führen, dass ein Fenster sehr kurz aufleuchtet, dies sollte jedoch selten vorkommen.

4
Adam Taylor

Ich habe ein kleines Tool erstellt, das den Aufruf an ein beliebiges Konsolentool weiterleitet, das fensterlos gestartet werden soll, und zwar in die ursprüngliche Datei:

https://github.com/Vittel/RunHiddenConsole

Benennen Sie die ausführbare Datei nach dem Kompilieren einfach in "<targetExecutableName> w.exe" um (fügen Sie ein "w" hinzu) und platzieren Sie es neben der ursprünglichen ausführbaren Datei. Sie können dann z. powershellw.exe mit den üblichen Parametern und es öffnet sich kein Fenster.

Wenn jemand eine Idee hat, wie er überprüfen kann, ob der erstellte Prozess auf Eingaben wartet, kann er gerne Ihre Lösung hinzufügen :)

2
Chris

Hier ist eine unterhaltsame Demo zum Steuern der verschiedenen Zustände der Konsole, einschließlich Minimieren und Ausblenden.

Add-Type -Name ConsoleUtils -Namespace WPIA -MemberDefinition @'
   [DllImport("Kernel32.dll")]
   public static extern IntPtr GetConsoleWindow();
   [DllImport("user32.dll")]
   public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'@

$ConsoleMode = @{
 HIDDEN = 0;
 NORMAL = 1;
 MINIMIZED = 2;
 MAXIMIZED = 3;
 SHOW = 5
 RESTORE = 9
 }

$hWnd = [WPIA.ConsoleUtils]::GetConsoleWindow()

$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.MAXIMIZED)
"maximized $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.NORMAL)
"normal $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.MINIMIZED)
"minimized $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.RESTORE)
"restore $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.HIDDEN)
"hidden $a"
Start-Sleep 2
$a = [WPIA.ConsoleUtils]::ShowWindow($hWnd, $ConsoleMode.SHOW)
"show $a"
0
js2010