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

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

En d'autres termes, le script doit s'exécuter silencieusement en arrière-plan sans aucun signe de l'utilisateur.

le crédit Supplémentaire pour une réponse qui n'utilise pas de composants tiers :)

91
demandé sur Peter Mortensen 2009-11-26 10:45:06

7 réponses

vous pouvez soit l'exécuter comme ceci (mais ceci montre une fenêtre pendant un certain temps):

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 exe exécuter des tâches programmées avec WinForm GUI dans PowerShell . Je l'utilise pour des tâches programmées.

Édité: que Marco a noté ce -windowstyle paramètre est disponible uniquement pour les V2.

93
répondu stej 2009-11-30 14:47:15

vous pouvez utiliser le PowerShell Community Extensions et faire ceci:

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 du forum .)

17
répondu ax. 2018-05-08 14:43:22

voici une approche qui ne nécessite pas de ligne de commande args ou un lanceur séparé. Ce n'est pas complètement invisible car une fenêtre apparaît momentanément au démarrage. Mais il disparaît alors rapidement. Là où C'est OK, c'est, je pense, l'approche la plus simple si vous voulez lancer votre script en double-cliquant dans explorer, ou via un raccourci de menu Démarrer (y compris, bien sûr, le sous-menu Démarrage). Et j'aime que ça fasse partie du code du script lui-même, pas quelque chose d'externe.

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)
9
répondu Andy Lowry 2015-01-16 20:40:11

j'avais ce problème quand je courais à partir de c#, sur Windows 7, le service" Interactive Services Detection " apparaissait quand je lançais une fenêtre powershell cachée comme le compte système.

utilisant le paramètre" CreateNoWindow " a empêché le service ISD de faire apparaître son avertissement.

process.StartInfo = new ProcessStartInfo("powershell.exe",
    String.Format(@" -NoProfile -ExecutionPolicy unrestricted -encodedCommand ""{0}""",encodedCommand))
{
   WorkingDirectory = executablePath,
   UseShellExecute = false,
   CreateNoWindow = true
};
4
répondu jmc 2017-11-26 17:58:39

Voici une doublure:

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 pour cela de clignoter une fenêtre très brièvement, cela devrait être un événement rare.

3
répondu Adam Taylor 2017-08-03 02:46:20

je pense que la meilleure façon de cacher l'écran de la console de la PowerShell lorsque vous exécutez un script de fond est ce code (" Bluecakes réponse).

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 était de vous aider, s'il vous plaît voter à " Bluecakes " dans sa réponse dans ce post.

1
répondu gavraham 2017-09-25 21:08:29

j'avais ce même problème. J'ai découvert si vous allez à la tâche dans programmeur de tâche qui exécute la powershell.exe script, vous pouvez cliquer sur " exécuter si l'utilisation est connecté ou non " et cela ne montrera jamais la fenêtre powershell lorsque la tâche s'exécute.

1
répondu Yusha 2018-05-31 18:35:53