PowerShell C#扩展:如何指定嵌套集合对象的默认显示属性
解决嵌套集合的PowerShell显示问题
方法一:在Cmdlet代码中动态配置显示规则
无需修改外部类,可在返回activity对象前,为每个person实例添加PSStandardMembers,指定其默认显示属性为Name,让PowerShell在渲染嵌套的participants集合时自动使用该属性。
修改后的ProcessRecord方法代码如下:
protected override void ProcessRecord() { base.ProcessRecord(); List<activity> activities = GetActivities(); // 遍历所有活动的参与者,配置显示属性 foreach (var act in activities) { if (act.participants == null) continue; foreach (var participant in act.participants) { // 创建默认显示属性集,指定Name为显示字段 var defaultDisplaySet = new PSPropertySet( PSStandardMembers.DefaultDisplayPropertySet, new[] { "Name" }); // 用PSObject包装外部类实例,添加格式化配置 var psObj = PSObject.AsPSObject(participant); psObj.Properties.Add( new PSNoteProperty( PSStandardMembers.DefaultDisplayPropertySet, defaultDisplaySet)); } } WriteObject(activities); }
方法二:全局生效的自定义类型格式化文件
如果希望所有person类型对象在PowerShell中都默认显示Name,可创建.ps1xml格式化文件并注册到会话中:
- 创建
Person.Format.ps1xml文件:
<?xml version="1.0" encoding="utf-8"?> <Configuration> <ViewDefinitions> <View> <Name>thosepeskyexternalclasses.person</Name> <ViewSelectedBy> <TypeName>thosepeskyexternalclasses.person</TypeName> </ViewSelectedBy> <!-- 定义宽格式(集合中显示的样式) --> <WideControl> <WideEntries> <WideEntry> <WideItem> <PropertyName>Name</PropertyName> </WideItem> </WideEntry> </WideEntries> </WideControl> <!-- 可选:定义列表/表格视图的显示规则 --> <ListControl> <ListEntries> <ListEntry> <ListItems> <ListItem> <PropertyName>Name</PropertyName> </ListItem> <ListItem> <PropertyName>Id</PropertyName> </ListItem> </ListItems> </ListEntry> </ListEntries> </ListControl> </View> </ViewDefinitions> </Configuration>
- 注册格式化文件:
- 若为模块,在
.psd1文件中添加配置:FormatsToProcess = @('Person.Format.ps1xml') - 手动注册执行:
Update-FormatData -AppendPath .\Person.Format.ps1xml
- 若为模块,在
两种方法的区别
- 方法一仅对当前Cmdlet返回的对象生效,不会影响其他场景下的
person对象显示; - 方法二为全局生效,所有该类型的对象都会遵循定义的显示规则。
内容的提问来源于stack exchange,提问作者William Holmes
相关产品推荐
相关产品推荐

