web-dev-qa-db-fra.com

Comment exécuter un script PowerShell sans afficher de fenêtre?

Comment est-il possible d'exécuter un script PowerShell sans afficher de fenêtre ou tout autre signe pour l'utilisateur?

En d'autres termes, le script doit être exécuté silencieusement en arrière-plan, sans aucun signe pour l'utilisateur.

Crédit supplémentaire pour une réponse qui n'utilise pas de composants tiers :)

107
Thomas Bratt

Vous pouvez soit le lancer comme ça (mais cela montre une fenêtre pendant un moment):

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

Ou vous utilisez un fichier d'aide que j'ai créé pour éviter la fenêtre appelée PsRun.exe qui fait exactement cela. Vous pouvez télécharger le fichier source et le fichier .exe Exécuter des tâches planifiées avec l'interface graphique de WinForm dans PowerShell . Je l'utilise pour des tâches planifiées.

Edited: comme Marco l'a noté, ce paramètre -windowstyle n'est disponible que pour V2.

111
stej

Vous pouvez utiliser le PowerShell Community Extensions et procédez comme suit:

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

Vous pouvez également le faire avec VBScript: http://blog.sapien.com/index.php/2006/12/26/more-fun-with-scheduled-powershell/

(Via ce fil de discussion .)

17
ax.

Voici une approche qui n'exige pas d'arguments en ligne de commande ou un programme de lancement distinct. Ce n'est pas complètement invisible car une fenêtre apparaît momentanément au démarrage. Mais il disparaît ensuite rapidement. À mon avis, c’est l’approche la plus simple si vous souhaitez lancer votre script en double-cliquant sur dans l’explorateur ou via un raccourci du menu Démarrer (y compris, bien sûr, le sous-menu Démarrage). Et j'aime bien que cela fasse partie du code du script lui-même, pas quelque chose d'extérieur.

Mettez ceci au début de votre script:

$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

J'avais le même problème. J'ai découvert que si vous allez dans le Tâche dans Planificateur de tâches qui exécute le script powershell.exe, vous pouvez cliquer sur "Exécuter si l’utilisateur est connecté ou non "et cela n’affichera jamais la fenêtre PowerShell lors de l’exécution de la tâche.

11
Yusha

J'avais ce problème lors de l'exécution de c #, sous Windows 7, le service "Détection de services interactifs" apparaissait lors de l'exécution d'une fenêtre Powershell masquée sous le compte SYSTEM.

L'utilisation du paramètre "CreateNoWindow" a empêché le service ISD d'afficher son avertissement.

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

Je pense que le meilleur moyen de masquer l'écran de la console de PowerShell lorsque vous exécutez un script d'arrière-plan est ce code (réponse " Bluecakes ").

J'ajoute ce code au début de tous mes scripts PowerShell que je dois exécuter en arrière-plan.

# .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

Si cette réponse vous a aidé, veuillez voter pour "Bluecakes" dans sa réponse à cet article.

5
gavraham

Voici un one-liner:

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

Bien qu'il soit possible que cela clignote très brièvement, cela devrait être rare.

4
Adam Taylor

J'ai créé un petit outil en passant l'appel à tout outil de la console que vous souhaitez démarrer sans fenêtre jusqu'au fichier d'origine:

https://github.com/Vittel/RunHiddenConsole

Après la compilation, renommez simplement le fichier exécutable "<targetExecutableName> w.exe" (ajoutez un "w") et placez-le à côté du fichier exécutable d'origine. Vous pouvez alors appeler e.G. powershellw.exe avec les paramètres habituels et une fenêtre ne s’ouvrira pas.

Si quelqu'un a une idée sur la manière de vérifier si le processus créé attend une entrée, je serais heureux d'inclure votre solution :)

2
Chris

Voici une démonstration amusante de contrôle des différents états de la console, y compris minimisée et masquée.

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