2009-11-26 5 views
76

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

En d'autres termes, le script devrait fonctionner tranquillement en arrière-plan, sans aucun signe à l'utilisateur.

crédit supplémentaire pour une réponse qui n'utilise des composants tiers :)

+0

Commander cette question si vous êtes intéressé par l'apprentissage: http://stackoverflow.com/questions/573623/powershell -vs-unix-shells –

Répondre

82

Vous pouvez l'exécuter comme celui-ci (mais cela montre une fenêtre pendant un certain temps):

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

Ou vous utilisez un fichier d'assistance 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 Run scheduled tasks with WinForm GUI in PowerShell. Je l'utilise pour les tâches planifiées.

Modifié: comme Marco a noté ce paramètre -windowstyle est disponible uniquement pour V2.

+1

Bon conseil. J'en ai aussi besoin pour une tâche planifiée :) –

+7

Pour ceux qui viennent et qui essaient cela, vous avez besoin de PowerShell v2 pour obtenir le paramètre -WindowStyle. –

+3

J'ai compilé le PsRun, cependant, si je l'ajoute à la tâche planifiée, il fait aussi clignoter une fenêtre ... – Ciantic

4

J'avais ce problème lors de l'exécution de C#, sur Windows 7, le service « Détection des services interactifs » fleurissait à une fenêtre lors de l'exécution de Powershell caché que le compte SYSTEM.

Utilisation du paramètre « CreateNoWindow » empêché le service de DSI surgissant il est alerte.

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

Voici une approche qui ne nécessite pas d'arguments de ligne de commande ni de lanceur distinct. Ce n'est pas complètement invisible car une fenêtre s'affiche momentanément au démarrage. Mais il disparaît 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 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 ça fasse partie du code du script lui-même, pas quelque chose d'extérieur.

Mettre cela à l'avant 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) 
2

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 pour que cela clignote une fenêtre très brièvement, qui devrait être rare occurrence.

1

Je pense que la meilleure façon de masquer l'écran de la console du PowerShell lorsque vous exécutez un script d'arrière-plan est this code ("Bluecakes" réponse).J'ajoute ce code au début de tous mes scripts PowerShell que j'ai besoin de lancer 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 est de vous aider, s'il vous plaît voter pour "Bluecakes" in his answer in this post.