2010-04-16 22 views
7

Estoy buscando ejecutar algunos scripts de PowerShell por medio de la automatización. Algo así como:Cómo ejecutar scripts de PowerShell a través de la automatización sin tener que ejecutar los problemas de Host

IList errors; 
Collection<PSObject> res = null; 
using (RunspaceInvoke rsi = new RunspaceInvoke()) 
{ 
    try 
    { 
     res = rsi.Invoke(commandline, null, out errors); 
    } 
    catch (Exception ex) 
    { 
     LastErrorMessage = ex.ToString(); 
     Debug.WriteLine(LastErrorMessage); 
     return 1; 
    } 
} 

el problema que estoy enfrentando es que si mi script usa cmdlets como write-host lo anterior arroja una System.Management.Automation.CmdletInvocationException -

No se puede invocar esta función porque el host actual no implementa it.

¿Cuáles son algunas buenas opciones para solucionar este problema?

+0

Scott, estoy enfrentando el mismo problema. ¿Podría proporcionar alguna guía o código sobre cómo realizó la implementación? –

+0

Bien, encontré la respuesta yo mismo: simplemente herede PSHost, PSHostUserInterface y PSHostRawUserInterface y haga que los métodos no hagan nada/devuelvan null. Para rastrear lo que normalmente sucedería, se podrían registrar mensajes/texto que de otro modo se imprimirían en la línea de cmd. –

Respuesta

11

Una opción es crear una función write-host e inyectarla en su espacio de ejecución. La función tendrá prioridad sobre un cmdlet con el mismo nombre. En esta función, no puede hacer nada o tal vez usar [console] :: writeline() si su aplicación es una aplicación de consola, o si su aplicación es una aplicación GUI, inyecte algún objeto en la sesión de PowerShell para que la función pueda escribir la salida a (mira en Runspace.SessionStateProxy.SetVariable).

Otra opción (un poco más complicada) es implementar el PowerShell hosting interfaces in your app.

+0

Fui con el enfoque de interfaces de hosting. Es una lástima que no haya una interfaz de usuario no interactiva predeterminada para el alojamiento. –

Cuestiones relacionadas