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

时间:2012-10-17 09:06:52

标签: c# powershell

我遇到通过C#

将参数传递给PowerShell的问题

我收到以下异常:

  

“用于提示用户失败的命令,因为主机程序或   命令类型不支持用户交互。尝试一个主机程序   支持用户交互,例如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<CommandParameter> commandParameters = new Collection<CommandParameter>();
    foreach (string scriptParameter in scriptParameters.Split(' '))
    {
        CommandParameter commandParm = new CommandParameter(null, scriptParameter);
        commandParameters.Add(commandParm);
        scriptCommand.Parameters.Add(commandParm);
    }
    pipeline.Commands.Add(scriptCommand);
    Collection<PSObject> psObjects;
    psObjects = pipeline.Invoke();
}

PS:

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

我在这里缺少什么?我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:11)

例外与参数无关。要么不使用需要实现主机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(...))。该功能应该在脚本中定义,或者更好地以不同的方式提供给它,例如,在全局范围内使用它调用另一个脚本。

P.S。如果您有自定义主机,则使用其中一个CreateRunspace()重载,将主机实例作为参数,以便链接主机和运行空间。