【问题标题】:How pipe powershell commands in c#如何在 c# 中管道 powershell 命令
【发布时间】:2012-05-10 16:43:23
【问题描述】:

目标是获得 Exchange 2010 站点的最小数据库,因此我尝试从 c# 运行以下 powershell 命令,

Get-MailboxDatabase -server Exchange2010 -Status | select-object Name,DatabaseSize

我正在苦苦挣扎的问题是 - 如何管道 Select 子句命令。

这是我的尝试,

WSManConnectionInfo wsConnectionInfo = new WSManConnectionInfo(new Uri("https://" + ExchangeSite + "/powershell?serializationLevel=Full"),
    "http://schemas.microsoft.com/powershell/Microsoft.Exchange", getCredential());
wsConnectionInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;
wsConnectionInfo.SkipCACheck = true;
wsConnectionInfo.SkipCNCheck = true;

rsRemoteRunspace = RunspaceFactory.CreateRunspace(wsConnectionInfo);
rsRemoteRunspace.Open();
Pipeline pipeLine = rsRemoteRunspace.CreatePipeline();

Collection<PSObject> DatabaSize = null;

Command myCommand = new Command("Get-MailboxDatabase");
myCommand.Parameters.Add("Server", "Exchange2010");
myCommand.Parameters.Add("Status", null);
Command myCommand2 = new Command("Select-Object");
    myCommand.Parameters.Add("Name");
myCommand.Parameters.Add("DatabaseSize");
pipeLineMB.Commands.Add(myCommand);
pipeLineMB.Commands.Add(myCommand2);
DatabaSize = pipeLine.Invoke();

但我明白了,

"A parameter cannot be found that matches parameter name 'Name'."

请记住,我不能使用 SnapIn,因为代码必须在执行 Exchange 服务器上的 cmdlet 的客户端计算机上运行。

欢迎任何建议。

编辑

我应用了 yamen 建议的修复,并且可以调用该命令,但是当我尝试获取该值时,我得到:“对象引用未设置为对象的实例。”

请注意,我可以获取 Servername 和 Name 的值,但它在 DatabaseSize 中失败,所以我猜 'Status' 标志未正确设置,因为该标志是启用此值的标志。

【问题讨论】:

  • select 是 Select-Object 的别名,我认为你不能在 Command 构造函数中使用别名(我一般不会。)
  • @MichaelEdenfield,如果我将其更改为 Select-Object,则会收到“找不到与参数名称‘DatabaseSize’匹配的参数”。请注意,相同的命令在 powershell ISE 中运行良好,Get-MailboxDatabase -server exchange2010 -Status |选择对象数据库大小

标签: c# .net powershell exchange-server


【解决方案1】:

我刚试过这个,有类似的情况

dir | select Name

它不起作用。给我同样的错误,说“名称”不是有效参数。然后我尝试了以下方法,它有效

dir | select -first 3

翻译成

        Runspace runspace = RunspaceFactory.CreateRunspace();
        runspace.Open();
        Pipeline pipeline = runspace.CreatePipeline();
        Command dir = new Command("dir");
        pipeline.Commands.Add(dir);
        Command select = new Command("select");
        select.Parameters.Add("first", 3);
        pipeline.Commands.Add(select);

我猜你需要找到DatabaseSize 是其值的参数的名称。

【讨论】:

  • 根据我的回答,该参数称为“属性”。
【解决方案2】:

你的意思是这样的:

Command myCommand2 = new Command("Select-Object");
myCommand2.Parameters.Add("DatabaseSize");

而不是这个:

Command myCommand2 = new Command("Select-Object");
myCommand.Parameters.Add("DatabaseSize");

注意第二行的myCommand2

无论如何,您可能会发现您实际需要的参数是Property 即:

myCommand2.Parameters.Add("Property", "DatabaseSize");

不止一个:

var props = new string[] { "DatabaseSize", "ServerName", "Name" };
myCommand2.Parameters.Add("Property", props);

【讨论】:

  • 我能够调用该命令,但现在尝试获取该值时出现错误。我猜 -Status 标志没有被正确应用,你能否确认我是否以正确的方式使用它。请参阅上面的我的 cmets。
  • 尝试myCommand.Parameters.Add("Status", true); 或只是myCommand.Parameters.Add("Status"); 并报告。
  • 我才意识到flag必须按照followig方式输入,myCommand.Parameters.Add("Status", true);谢谢。
  • yamen,未标记答案只是为了引起您的注意,希望您收到通知并可以对此线程发表评论。谢谢
  • @m0dest0 我可以建议你打开新的作为另一个问题吗?这将是一个不同的问题,你并不是真的要使用一个你不断编辑的问题来解决不同的问题。如果人们解决了问题,然后您又提出另一个问题并带走代表,他们将不太可能回答您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
相关资源
最近更新 更多