2010-04-16 80 views
7

我期望通过自动化运行一些PowerShell脚本。喜欢的东西:如何通过自动运行PowerShell脚本而不运行主机问题

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; 
    } 
} 

我现在面临的问题是,如果我的脚本使用的cmdlet如write-host上述抛出System.Management.Automation.CmdletInvocationException -

因为 当前宿主,并不能实现不能调用此函数 吧。

解决此问题有哪些好的选择?

+0

Scott,我面临同样的问题。你能提供一些关于你如何实施的指导或代码吗? – 2010-11-14 22:24:16

+0

好的,我自己找到了答案:只需继承PSHost,PSHostUserInterface和PSHostRawUserInterface,并让方法不做任何事情/返回null。为了追踪通常会发生的情况,可以记录否则将打印在cmd行的消息/文本。 – 2010-11-15 15:35:07

回答

11

一个选项是创建一个写主机函数并将其注入到您的运行空间。该函数将优先于具有相同名称的cmdlet。在这个函数中,如果你的应用程序是一个控制台应用程序,或者如果你的应用程序是一个GUI应用程序,那么你无能为力,或者可能使用[console] :: writeline(),将一些对象注入到PowerShell会话中,该函数可以写入输出(查看Runspace.SessionStateProxy.SetVariable)。

另一个(有点复杂)选项是实现PowerShell hosting interfaces in your app

+0

我使用托管接口的方法。太糟糕了,没有用于托管的默认NonInteractive用户界面。 – 2010-04-17 17:11:40