0

我正在尝试对 Exchange 服务器执行一些远程 PowerShell 命令。现在我在参数中执行 ScriptBlocks 时遇到问题。

我的 C# 代码如下所示:

    List<object> parameters = new List<object>()
    {
        "DisplayName","Guid","ManagedBy",
        new Hashtable()
        {
            {"Name","NameRename"},
            {"Expression","Name"}
        }
    };


    powershell.AddCommand("Get-DistributionGroup");
    powershell.AddParameter("ResultSize", "unlimited");
    powershell.AddCommand("Select-Object");
    powershell.AddParameter("Property", parameters);
    powershell.AddParameter("ExpandProperty", "ManagedBy");

    parameters = new List<object>()
    {
        "DisplayName","Guid","NameRename",new Hashtable()
        {
            {"Name","ManagedByGuid"},
            {"Expression",ScriptBlock.Create("($_.ManagedBy).ObjectGuid -join ','")}
        }
    };

    powershell.AddCommand("Select-Object");
    powershell.AddParameter("Property", parameters);

    Collection<PSObject> result = powershell.Invoke();

我知道缺少一些东西(runspace open fe),但是这段代码应该只是一个例子,因为我的实际代码是动态工作的,所以你看不到真正的命令。怎么了...我的结果显示“ManagedByGuid”列为空。第一个参数中的重命名仅在表达式中根本没有脚本时才有效(一旦我将表达式设置为ScriptBlock.Create("$_.Name")它也会提供空值)。所以似乎powershell没有执行脚本块,而是只在没有脚本的情况下简单地评估字符串......

当我不是将命令分开而不是将一个完成的脚本作为字符串传递给 powershell 时,它工作得很好......例如:

powershell.AddScript("Get-DistributionGroup -ResultSize unlimited | Select-Object -Property Alias,Guid,DisplayName,WhenChanged,WhenCreated,@{name=\"NameRename0\";expression={$_.Name}},ManagedBy -expand ManagedBy  |Select-Object Alias,Guid,DisplayName,WhenCreated,WhenChanged,NameRename0,@{Name=\"ObjectGuid\";expression={ ($_.ManagedBy).ObjectGuid -join ',' }} -unique");

我也可以使用这种方法,但首先我不想重做所有代码,其次脚本块也应该工作?

有谁知道为什么这不起作用......?

4

0 回答 0