2010-04-16 3 views
7

Sto cercando di eseguire alcuni script di PowerShell tramite l'automazione. Qualcosa di simile:Come eseguire gli script di PowerShell tramite l'automazione senza eseguire i problemi di 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; 
    } 
} 

il problema che sto affrontando è che se il mio script utilizza cmdlet quali write-host quanto sopra genera un System.Management.Automation.CmdletInvocationException -

non può invocare questa funzione perché l'host corrente non implementa it.

Quali sono alcune buone opzioni per aggirare questo problema?

+0

Scott, sto affrontando lo stesso problema. Potresti fornire qualche guida o codice su come hai fatto l'implementazione? –

+0

Ok, ho trovato la risposta da solo: eredita PSHost, PSHostUserInterface e PSHostRawUserInterface e i metodi non eseguono nulla/restituiscono null. Per rintracciare cosa accadrebbe normalmente, potrebbero essere registrati messaggi/testo che altrimenti verrebbero stampati sulla linea cmd. –

risposta

11

Un'opzione è creare una funzione di scrittura-host e inserirla nello spazio di esecuzione. La funzione avrà la precedenza su un cmdlet con lo stesso nome. In questa funzione, non puoi fare nulla o forse usare [console] :: writeline() se la tua app è un'app console, o se la tua app è un'app GUI, iniettare alcuni oggetti nella sessione di PowerShell che la funzione può scrivere l'output a (guarda Runspace.SessionStateProxy.SetVariable).

Un'altra opzione (un po 'più complicata) è l'implementazione di PowerShell hosting interfaces in your app.

+0

Sono andato con l'approccio delle interfacce di hosting. Peccato che non ci sia un'interfaccia utente non interattiva di default per l'hosting. –