Comment exécuter un script PowerShell sans afficher de fenêtre?
-
05-07-2019 - |
Question
Comment est-il possible d'exécuter un script PowerShell sans afficher de fenêtre ni d'autre signe 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 n'utilisant pas de composants tiers:)
La solution
Vous pouvez soit l'exécuter comme ceci (mais cela montre une fenêtre pendant un moment):
PowerShell.exe -windowstyle hidden { your script.. }
Ou 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écutez des tâches planifiées avec l'interface graphique WinForm dans PowerShell . Je l'utilise pour des tâches planifiées.
Modifié: comme l'a noté Marco, ce paramètre -windowstyle n'est disponible que pour la V2.
Autres conseils
Vous pouvez utiliser les extensions de communauté PowerShell et le faire:
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/
-
Planification de tâches PowerShell masquées (archives Internet)
-
Plus de plaisir avec PowerShell prévu (archive Internet)
Voici une approche qui n'exige pas d'arguments de 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.
Placez 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 le même problème. J'ai découvert que si vous accédez à la tâche de Planificateur de tâches qui exécute le script powershell.exe , vous pouvez cliquer sur & Quot; Indiquer si l'utilisateur est connecté ou non " et cela ne montrera jamais la fenêtre PowerShell lorsque la tâche sera exécutée.
J'avais ce problème lors de l'exécution à partir de c #, sous Windows 7, la & détection de services interactifs & "; Le service apparaissait lors de l'exécution d'une fenêtre Powershell masquée en tant que compte SYSTEM.
Utilisation de " CreateNoWindow " paramètre 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
};
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")
Même s'il est possible que cela clignote très brièvement, cela devrait être rare.
Je pense que le meilleur moyen de masquer l'écran de la console de PowerShell lorsque vous exécutez un script en arrière-plan 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 vous a aidé, veuillez voter pour &"; Bluecakes & "; dans sa réponse dans cet article.
J'ai créé un petit outil qui transmet 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 l'exécutable en & "; < targetExecutableName > w.exe &"; (ajoutez un " w ") et placez-le à côté de l'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 de la façon de vérifier si le processus créé attend une entrée, je serais heureux d'inclure votre solution:)