在C#中管PowerShell如何命令(How pipe powershell commands i

2019-09-16 22:34发布

我们的目标是获得一个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'."

请记住,我不能使用管理单元,因为代码必须在Exchange服务器上执行的cmdlet在客户机上运行。

任何意见是值得欢迎的。

编辑

我申请由衙门建议的修复和命令能够被调用,但是当我尝试获取的价值,我得到:“对象引用不设置到对象的实例”

请注意,我可以让服务器名和姓名的值,但它在DatabaseSize失败,所以我猜“状态”标志没有被正确设定,因为这个标志是一个使此值。

Answer 1:

这里没有你的意思是这样的:

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);


Answer 2:

我只是尝试这样做,也有类似的情形

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是价值,我猜。



文章来源: How pipe powershell commands in c#