Pregunta

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

En otras palabras, el script debe ejecutarse silenciosamente en segundo plano sin ninguna señal para el usuario.

Crédito adicional por una respuesta que no utiliza componentes de terceros :)

¿Fue útil?

Solución

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

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

O usa un archivo auxiliar que creé para evitar la ventana llamada PsRun.exe que hace exactamente eso. Puede descargar el archivo fuente y exe Ejecute tareas programadas con WinForm GUI en PowerShell . Lo uso para tareas programadas.

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

Otros consejos

Puede usar las PowerShell Community Extensions 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/

(Via este hilo del foro <"> a>.)

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

Ponga esto al frente de su 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 mismo problema. Descubrí que si va a la Tarea en Programador de tareas que ejecuta el script powershell.exe , puede hacer clic en & Quot; Ejecutar si el usuario ha iniciado sesión o no " y eso nunca mostrará la ventana de PowerShell cuando se ejecute la tarea.

Estaba teniendo este problema cuando ejecuto desde c #, en Windows 7, el & "; Detección de servicios interactivos &"; el servicio aparecía cuando se ejecutaba una ventana oculta de PowerShell como la cuenta SYSTEM.

Uso de " CreateNoWindow " El parámetro 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 una frase:

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 muestre 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 ejecuta scripts en segundo plano es este código (" Bluecakes " respuesta).

Agrego 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.

He creado una pequeña herramienta que pasa la llamada a cualquier herramienta de consola que desee iniciar sin ventanas al archivo original:

https://github.com/Vittel/RunHiddenConsole

Después de compilar, simplemente cambie el nombre del ejecutable a " < targetExecutableName > w.exe " (agregue un " w ") y colóquelo junto al ejecutable original. Luego puede llamar a e.G. powershellw.exe con los parámetros habituales y no abrirá una ventana.

Si alguien tiene una idea de cómo verificar si el proceso creado está esperando la entrada, me complacerá incluir su solución :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top