首页 > 解决方案 > 具有 System.Management.Automation 的 Select-Object 不返回选定的属性

问题描述

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

运行空间管道设置:

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

现在我希望结果是 PSObjects 的列表,其属性为RecipientTypeDetailsPrimarySmtpAddressDisplayName。但是,正如我在上面提到的,返回一个名为RecipientTypeDetails,PrimarySmtpAddress,DisplayNamenull 值的属性。

未归还的属性

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

标签: c#powershell

解决方案


与参数一起使用时,该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(s),其中每个对象都包含您添加到命令中的属性。

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

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

推荐阅读