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 :)
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.
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/
Planifier des tâches PowerShell masquées (Internet Archive)
Plus de plaisir avec PowerShell prév (Internet Archive)
(Via ce fil de discussion .)
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)
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.
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
};
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.
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.
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 :)
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"