C# 使用System.Management.Automation选择对象不会返回所选属性

C# 使用System.Management.Automation选择对象不会返回所选属性,c#,powershell,C#,Powershell,我正在使用System.Management.Automation.dll获取c中的邮箱,并使用Select对象仅返回我需要的字段。不幸的是,返回的结果是具有单个属性和空值的PSObject列表。属性未正确映射到返回的PSObject 运行空间管道设置: var o365ConnectionUri = "https://outlook.office365.com/powershell-liveid/"; var exchangeModuleUri = "http://schemas.micros

我正在使用System.Management.Automation.dll获取c中的邮箱,并使用Select对象仅返回我需要的字段。不幸的是,返回的结果是具有单个属性和空值的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();
现在,我希望结果是一个PSObject列表,其中包含RecipientTypeDetails、PrimarySmtpAddress和DisplayName的属性。但是,正如我上面提到的,返回一个名为RecipientTypeDetails、PrimarySmtpAddress、DisplayName的属性,该属性的值为null

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

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

在本例中,通过执行string.Join、、fieldsToSelect将三个属性连接成一个字符串。 这归结为要求Select对象查找一个名为RecipientTypeDetails、PrimarySmtpAddress、DisplayName的属性,当然,不存在的属性返回null

要解决此问题,只需将属性名称数组添加到命令:

var sparseMailboxesCmd = new Command("Select-Object");
sparseMailboxesCmd.Parameters.Add("Property", fieldsToSelect);
至于你最近的评论: 选择对象将返回PSObject,其中每个对象都包含您添加到命令中的特性

要从这些PSObject中获得扩展的实际值,您可以使用.ToString解决方案,因为本例中的属性都是string类型。 虽然我不太喜欢C,但我认为这也可以从PSObject获取属性值:

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

将parameter属性添加为array,而不是连接的stringo,这肯定是问题所在。请随意添加这一点作为答案,我会给你打分。另一方面,返回的属性值是PSObject而不是object,因此我在转换它们时遇到了一些问题。您知道将PSObject强制转换为值类型的正确方法吗?我刚才使用了.ToString,然后在字符串上使用了Convert.ChangeType,我不确定这是否适用于所有情况,但现在它适用于我。我实际上按照您的建议访问属性值,但它们不包含对象类型,而是包含另一个PSObject。通常属性值包含一个可以转换为任何值类型的基本对象,所以这有点不寻常。@NicholasJ.Markkula奇怪。正如我所说,我并不真正喜欢C,但从你的反馈中我学到了。