具有System.Management.Automation的Select-Object不返回所选属性

时间:2018-12-07 21:44:01

标签: c# powershell

我正在使用System.Management.Automation.dll通过Select Object获取c#中的邮箱,以仅返回我需要的字段。不幸的是,返回的结果是具有单个属性和空值的PSObjects列表。这些属性未正确映射到返回的PSObjects。

运行空间管道设置:

var o365ConnectionUri = "https://outlook.office365.com/powershell-liveid/";
var exchangeModuleUri = "http://schemas.microsoft.com/powershell/Microsoft.Exchange";
var connectionInfo = new WSManConnectionInfo(new Uri(o365ConnectionUri), exchangeModuleUri, credentials)
{
    AuthenticationMechanism = AuthenticationMechanism.Basic
};
var runspace = RunspaceFactory.CreateRunspace(connectionInfo);
runspace.Open();
var pipeline = runspace.CreatePipeline()

命令执行:

var getMailboxesCmd = new Command("Get-Mailbox");
getMailboxesCmd.Parameters.Add("ResultSize", "unlimited");

var fieldsToSelect = new[]
{
    "RecipientTypeDetails",
    "PrimarySmtpAddress",
    "DisplayName"
};
var sparseMailboxesCmd = new Command("Select-Object");
sparseMailboxesCmd.Parameters.Add("Property", string.Join(",", fieldsToSelect));

pipeline.Commands.Add(getMailboxesCmd);
pipeline.Commands.Add(sparseMailboxesCmd );

var result = pipeline.Invoke();

现在,我希望结果是具有RecipientTypeDetailsPrimarySmtpAddressDisplayName属性的PSObjects列表。但是,如上所述,我们返回了一个名为RecipientTypeDetails,PrimarySmtpAddress,DisplayName且值为空的属性。

Properties Not Returned

据我所知这肯定是System.Management.Automation.dll中的错误,是否有其他人处理过此问题或找到了解决方法?

1 个答案:

答案 0 :(得分:2)

Select-Object命令与参数Property一起使用时,将单个属性名称作为字符串或将属性名称的字符串数组作为参数。

在您的情况下,您通过执行string.Join(",", fieldsToSelect)将这三个属性串联在一起成为一个字符串。 归结为要求Select-Object查找一个名为“ RecipientTypeDetails,PrimarySmtpAddress,DisplayName”的属性,并且该属性当然不存在(返回null)。

要解决此问题,只需在命令中添加属性名称的数组

var sparseMailboxesCmd = new Command("Select-Object");
sparseMailboxesCmd.Parameters.Add("Property", fieldsToSelect);

关于您的最新评论:
Select-Object将返回PSObject,其中每个对象都包含您已添加到命令中的属性。

要从这些PSObject中获取(扩展)实际值,使用.ToString的解决方案将行得通,因为这种情况下的属性都是字符串类型。 尽管我不太喜欢C#,但我认为这也可以从PSObjects中获取属性值:

object.Properties["RecipientTypeDetails"].Value
object.Properties["PrimarySmtpAddress"].Value
object.Properties["DisplayName"].Value