如何从c#发送字符串参数到powershell?

时间:2013-04-11 12:30:20

标签: c# powershell

我用c#编写了2个应用程序,用PowerShell 1.0编写了另一个应用程序,在我的代码的某些方面,我想传递一个字符串,指示我的c#app中的服务器名称到我写的powershell脚本文件,我该如何发送?我该如何接受呢?

我的代码:

RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();
RunspaceInvoke scriptInvoker = new RunspaceInvoke(runspace);

Pipeline pipeline = runspace.CreatePipeline();

String scriptfile = @"c:\test.ps1";

Command myCommand = new Command(scriptfile, false);
CommandParameter testParam = new CommandParameter("username", "serverName");

myCommand.Parameters.Add(testParam);


pipeline.Commands.Add(myCommand);
Collection<PSObject> psObjects;
psObjects = pipeline.Invoke();
runspace.Close();

和我的powershell脚本

param([string]$Username)

write-host $username 

我错过了什么?我对powershell很新。

1 个答案:

答案 0 :(得分:1)

我的机器有PowerShell 2.0和3.0但不是1.0,所以我的结果可能会有所不同。当我在PowerShell 3.0框中运行代码时,我得到:

  

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

它不喜欢Write-Host,因此我将脚本更改为

param([string]$Username)

Get-Date
Get-ChildItem -Path $userName

获取日期,以便我可以看到一些输出,而不依赖于参数和GCI来使用参数。我将您的代码修改为如下所示:

RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
using (var runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration))
{
    runspace.Open();

    String scriptfile = @"..\..\..\test.ps1";
    String path = @"C:\Users\Public\";

    var pipeline = runspace.CreatePipeline();
    pipeline.Commands.Add(new Command("Set-ExecutionPolicy RemoteSigned -Scope Process", true));
    pipeline.Invoke();

    pipeline = runspace.CreatePipeline();
    var myCommand = new Command(scriptfile, false);
    var testParam = new CommandParameter("username", path);
    myCommand.Parameters.Add(testParam);
    pipeline.Commands.Add(myCommand);
    var psObjects = pipeline.Invoke();
    foreach (var obj in psObjects)
    {
        Console.WriteLine(obj.ToString());
    }
    runspace.Close();
}

Console.WriteLine("Press a key to continue...");
Console.ReadKey(true);

并且在没有错误的情况下运行并在PoSh 2和3上显示文件夹内容。

有关信息,如果您只是为当前进程设置执行策略,则无需运行提升,因此我可以在代码中执行此操作。