【问题标题】:Convert from PowerShell to C#从 PowerShell 转换为 C#
【发布时间】:2020-05-01 03:55:55
【问题描述】:

这是 C# 中 Exchange 的问题。

我需要转换这个 PowerShell 命令:

Get-MailboxDatabase -Status | Where-Object {$_.IsExcludedFromProvisioning -eq $false} | select Name,DatabaseSize | sort DatabaseSize

我尝试了以下代码,但它给出了 System.Management.Automation.CmdletInvocationException

PSCommand command1 = new PSCommand();
            command1.AddCommand("Get-MailboxDatabase");
            command1.AddParameter("Status");
            command1.AddCommand("Where-Object");
            command1.AddArgument("IsExcludedFromProvisioning");
            command1.AddParameter("eq", false);
            command1.AddCommand("select-object").AddParameter("Property", new string[] { "Name", "DatabaseSize" });
            command1.AddCommand("sort-object").AddParameter("Property", "DatabaseSize");
            PowershellExchange.Commands = command1;
            PowershellExchange.Runspace = RunspaceExchange;
            var tmp1 = PowershellExchange.Invoke();

告诉我,可能是什么问题,或者您如何改写 powershell 命令?

编辑

内部异常:指定的运算符需要 -Property 参数和 -Value 参数。为这两个参数指定值,然后再次运行命令。

【问题讨论】:

  • 请用您的错误更新问题:-)
  • Where-Object 的参数是一个脚本块。你实际上传递了Where-Object IsExcludedFromProvisioning -eq false 的道德等价物,其中-eq 是一个参数而不是一个运算符——完全不同的东西。使用AddScript 添加整个语句而不是零碎构建它可能会更好(此处似乎不涉及任何变量)。
  • @JeroenMostert,我试试你的建议,我将 Where-Object 块替换为 command1.AddParameter("ScriptBlock", ScriptBlock.Create("Where-Object $_.IsExcludedFromProvisioning")); command1.AddParameter("eq", false);。命令有效,但返回空集合。如果我在 Powershell 中输入我的 PowerShell 命令,它们会返回 10 行数据。
  • 因为AddParameter("eq", false) 仍然是错误的。这 不是 参数,它调用-eq 运算符。使用AddScript 有道德问题吗?这比有效地自己进行解析要简单得多。
  • @JeroenMostert,现在我使用command1.AddScript("Where-Object $_.IsExcludedFromProvisioning -eq $false"); 并且命令也返回空集合。我也尝试使用带有完整 powershell 命令的脚本,它们也返回空集合

标签: c# powershell exchange-server


【解决方案1】:

这似乎违反直觉,但在以下方面:

... |Where-Object Something -eq $SomeValue

-eq 实际上是一个开关参数,它的详细形式是:

... |Where-Object -Property:Something -Eq:$true -Value:$SomeValue

因此,要在没有过滤器脚本块的情况下重新创建 Where-Object 管道元素:

command1.AddCommand("Where-Object")
        .AddParameter("Property", "IsExcludedFromProvisioning")
        .AddParameter("Eq", true)
        .AddParameter("Value", false);

【讨论】:

  • 不,这无济于事。问题是 $_.IsExcludedFromProvisioning 它不是财产。我读了那个$_。类似 PSItem 的东西
  • @ishkin Where-Object Something -eq $SomeValue 在功能上等同于Where-Object {$_.Something -eq $SomeValue}
【解决方案2】:

感谢@Jeroen Mostert 的帮助

最终代码看起来像

PSCommand command1 = new PSCommand();
                command1.AddScript("Get-MailboxDatabase -Status | Where-Object {$_.IsExcludedFromProvisioning -eq $false} | select Name,DatabaseSize | sort DatabaseSize");
                PowershellExchange.Commands = command1;
                PowershellExchange.Runspace = RunspaceExchange;
                var tmp1 = PowershellExchange.Invoke();

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 2019-02-12
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多