2009-11-26 23 views
76

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

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

crédito adicional para una respuesta que no utiliza componentes de terceros :)

+0

Pedido esta pregunta si usted está interesado en el aprendizaje: http://stackoverflow.com/questions/573623/powershell -vs-unix-shells –

Respuesta

82

Usted puede ejecutarlo como esto (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 exe Run scheduled tasks with WinForm GUI in PowerShell. Lo uso para tareas programadas.

Editado: como Marco señaló que el parámetro -windowstyle está disponible solo para V2.

+1

Bonito consejo. Lo necesito para una tarea programada también :) –

+7

Para cualquiera que lo intente y lo intente, necesita PowerShell v2 para obtener el parámetro -WindowStyle. –

+3

Compilé el PsRun, sin embargo, si lo agregué a la tarea programada, también parpadea una ventana ... – Ciantic

4

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" impidió 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 
}; 
9

Aquí hay un enfoque que no requiere líneas de comando args 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.

poner esto en la parte delantera de su guión:

$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

Aquí hay una sola línea:

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 parpadea una ventana muy brevemente, que debe ser una rara ocurrencia.

1

Creo que la mejor manera de ocultar la pantalla de la consola de PowerShell cuando está ejecutando un script de fondo es this code ("Bluecakes" respuesta).

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 la ayuda que, por favor, vote a "Bluecakes" in his answer in this post.

Cuestiones relacionadas