0

我正在尝试从 C# 调用以下 PS 脚本:

Get-MailboxDatabase -IncludePreExchange2007 -Status | Where-Object {$_.Server -eq 'myserver'}

我已经设法使用以下代码在管道之前执行第一部分:

  public void Test()
  {
     using (Pipeline pipeline = _runspace.CreatePipeline())
     {
        var cmd1 = new Command("Get-MailboxDatabase");
        cmd1.Parameters.Add("IncludePreExchange2007");
        cmd1.Parameters.Add("Status");

        var cmd2 = new Command("Where-Object");
        //how do I script {$_.Server -eq 'myserver'} ???

        pipeline.Commands.Add(cmd1);
        //pipeline.Commands.Add(cmd2);

        Collection<PSObject> result = pipeline.Invoke();
     }
  }

但是我如何为 Where-Object 编写第二部分的脚本???

4

2 回答 2

2

您可以简单地使用 LINQ:

result.Where(p => (string)p.Properties["Server"].Value == "myserver"));
于 2012-12-31T17:13:13.930 回答
0

如果其他用户访问此问题,我将更新此线程。

为了提高性能,您可以在 PowerShell 本身中执行过滤,并可以在那里使用 Where-Object。我在这里提供了答案:Calling PowerShell's where-object from C#

本质上,您将需要使用添加脚本而不是添加如下命令:

    //Getting all command variables
    string myServer = "ServerName";

    //Create Script command
    String customScriptText = String.Format("Get-MailboxDatabase -IncludePreExchange2007 -Status | Where-Object {{$_.Server -eq \"{0}\"}}", myServer);

    pipeline.Commands.AddScript(customScriptText);

注意{ and }使用双花括号进行转义,即{{}}. \"还要在 String.Format 方法中使用反斜杠来转义引号。

于 2016-04-22T16:18:54.463 回答