1

我正在编写 2 个应用程序,一个使用 c#,另一个使用 powershell 1.0,在我的代码的某些位置,我想将指示服务器名称的字符串从我的 c# 应用程序传递到我编写的 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有点陌生。

4

1 回答 1

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

Get-Date 这样我就可以看到一些输出而不依赖于参数和 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 上显示了文件夹内容。

对于信息,如果您只是为当前进程设置执行策略,则不需要运行提升,因此我能够在代码中执行此操作。

于 2013-05-10T18:07:14.300 回答