【问题标题】:PowerShell WhereObjectCommand from C#来自 C# 的 PowerShell WhereObjectCommand
【发布时间】:2016-04-23 01:02:53
【问题描述】:

我正在尝试从 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 编写第二部分的脚本???

【问题讨论】:

    标签: c# powershell-2.0


    【解决方案1】:

    您可以简单地使用 LINQ:

    result.Where(p => (string)p.Properties["Server"].Value == "myserver"));
    

    【讨论】:

    • 你是对的,可能我不会获得更好的性能,因为在我从第一个命令获得所有结果后会应用此过滤器
    【解决方案2】:

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

    提高性能,您可以在 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 方法中使用反斜杠将引号转义为 \"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 2018-08-18
      相关资源
      最近更新 更多