我正在尝试对 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");
我也可以使用这种方法,但首先我不想重做所有代码,其次脚本块也应该工作?
有谁知道为什么这不起作用......?