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 :)
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.
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/
-
Schedule Hidden PowerShell Tasks (Internet Archive)
-
plus de plaisir avec la PowerShell programmée (Internet Archive)
(Via ce fil de discussion du forum .)
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)
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
};
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.
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.
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.