如何通过C#将参数传递给PowerShell

我有问题通过C#传递参数到PowerShell

我收到以下exception:

“由于主机程序或命令类型不支持用户交互而提示用户失败的命令。尝试支持用户交互的主机程序,例如Windows PowerShell控制台或Windows PowerShell ISE,并从命令中删除与提示相关的命令不支持用户交互的类型,例如Windows PowerShell工作流“

CS:

private static void RunPowershellScript(string scriptFile, string scriptParameters) { string scriptParameters = "param1 param2"; RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create(); Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration); runspace.Open(); RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace); Pipeline pipeline = runspace.CreatePipeline(); Command scriptCommand = new Command(scriptFile); Collection commandParameters = new Collection(); foreach (string scriptParameter in scriptParameters.Split(' ')) { CommandParameter commandParm = new CommandParameter(null, scriptParameter); commandParameters.Add(commandParm); scriptCommand.Parameters.Add(commandParm); } pipeline.Commands.Add(scriptCommand); Collection psObjects; psObjects = pipeline.Invoke(); } 

PS:

 Function Foo ($arg1, $arg2) { Write-Host $arg1 Write-Host $arg2 } Foo $args[0] $args[1] 

我在这里缺少什么? 我怎么能做这个工作?

例外与参数无关。 要么不使用需要实现主机UI的命令(包括Write-Host ),要么实现自己的自定义主机( PSHost )和此UI( PSHostUserInterface )。 下面是一个简单主机的示例(如果您选择这种方式,MSDN上还有更多内容): http : //msdn.microsoft.com/en-us/library/windows/desktop/ee706559(v = vs.85)的.aspx

对于简单的任务,实现具有UI的主机可能太多了。 您可以考虑简单地定义具有相同参数的函数Write-Host并实现它以使其在您的特定情况下工作(例如, [Console]::WriteLine(...) )。 此函数应在脚本中定义或以更好的方式以不同的方式为其提供,例如,在全局范围内调用另一个脚本。

PS如果您有自定义主机,则使用CreateRunspace()重载之一,将主机实例作为参数,以链接主机和运行空间。