Get-Module -ListAvailable按Directory分组输出的实现原理是什么?
PowerShell Get-Module 按目录分组输出的实现原理
这种分组效果是PowerShell的格式化引擎基于预定义规则实现的,和你捕获的数组本身结构没有关系,具体逻辑如下:
- 你没在PSModuleInfo对象的公开属性中找到Directory属性是正常的,每个模块对应的目录路径实际存储在隐藏属性
ModuleBase中,你可以执行Get-Module -ListAvailable | Select-Object Name, ModuleBase直接查看每个模块对应的目录路径。 - PowerShell为每种类型的输出对象都预设了专门的格式化规则(存储在.ps1xml格式的系统配置文件中),对于
PSModuleInfo类型的对象,官方预设的格式化规则就指定了按ModuleBase属性分组展示。 - 你用
$m = Get-Module -ListAvailable捕获到的数组确实是普通的PSModuleInfo对象集合,本身没有任何分组结构。但当你直接打印$m时,PowerShell的格式化引擎会自动读取PSModuleInfo对应的格式化规则,遍历所有对象按ModuleBase分组后再渲染输出,所以依然会呈现按目录分段的展示效果。
你也可以手动指定分组规则覆盖默认配置,比如执行Get-Module -ListAvailable | Format-Table -GroupBy ModuleType,输出就会变成按模块类型分组,进一步验证分组是格式化引擎的渲染效果,和对象集合本身的结构无关。
内容的提问来源于stack exchange,提问作者joeking
相关产品推荐
相关产品推荐

