¿Cómo ejecutar un script de PowerShell sin mostrar una ventana?

¿Cómo es posible ejecutar un script de PowerShell sin mostrar una ventana o cualquier otro signo para el usuario?

En otras palabras, la secuencia de comandos debe ejecutarse silenciosamente en el fondo sin ningún signo para el usuario.

Crédito extra por una respuesta que no usa componentes de terceros 🙂

Puede ejecutarlo así (pero esto muestra una ventana por un tiempo):

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

O utiliza un archivo auxiliar que he creado para evitar la ventana llamada PsRun.exe que hace exactamente eso. Puede descargar el archivo fuente y el archivo ejecutable Ejecutar tareas progtwigdas con la GUI de WinForm en PowerShell . Lo uso para tareas progtwigdas.

Editado: como Marco notó esto, el parámetro -windowstyle está disponible solo para V2.

Puede usar las extensiones de comunidad de PowerShell y hacer esto:

 start-process PowerShell.exe -arg $pwd\foo.ps1 -WindowStyle Hidden 

También puede hacer esto con VBScript: http://blog.sapien.com/index.php/2006/12/26/more-fun-with-scheduled-powershell/

  • Progtwigr tareas ocultas de PowerShell (Internet Archive)

  • Más diversión con PowerShell progtwigdo (Internet Archive)

(A través de este hilo del foro )

Aquí hay un enfoque que no requiere argumentos de línea de comando o un iniciador por separado. No es completamente invisible porque una ventana se muestra momentáneamente al inicio. Pero luego rápidamente desaparece. Donde está bien, creo que este es el enfoque más fácil si desea iniciar su secuencia de comandos haciendo doble clic en el explorador o mediante un acceso directo al menú Inicio (incluido, por supuesto, el submenú de Inicio). Y me gusta que sea parte del código del script en sí, no algo externo.

Pon esto al frente de tu 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) 

Estaba teniendo este problema al ejecutar desde c #, en Windows 7, el servicio “Detección de servicios interactivos” aparecía al ejecutar una ventana oculta de powershell como la cuenta SYSTEM.

El uso del parámetro “CreateNoWindow” evitó que el servicio ISD apareciera como advertencia.

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

Aquí hay un trazador de líneas:

 mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -NoLogo -Command """"& 'C:\Example Path That Has Spaces\My Script.ps1'"""""", 0 : window.close") 

Aunque es posible que esto destelle una ventana muy brevemente, eso debería ser algo raro.

Creo que la mejor manera de ocultar la pantalla de la consola de PowerShell cuando está ejecutando un script de fondo es este código (respuesta de ” Bluecakes “).

Agregué este código al comienzo de todos mis scripts de PowerShell que necesito ejecutar en segundo plano.

 # .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 esta respuesta fue de ayuda, vote a “Bluecakes” en su respuesta en esta publicación.

Estaba teniendo este mismo problema. Descubrí que si vas a la Tarea en el Progtwigdor de tareas que ejecuta el script powershell.exe , puedes hacer clic en ” Ejecutar si el uso está conectado o no ” y eso nunca mostrará la ventana de powershell cuando se ejecuta la tarea.