expandproperty 用于将对象的指定属性值“提取”为独立标量值,而非保留其对象封装;适用于下游命令仅接受字符串等简单类型时,如传递 ad 用户 dn 给 get-adgroup 或提取注册表 property 名称。
expandproperty 的作用是把对象的某个属性“抽出来”,变成独立的值,而不是保留它作为对象的一部分。当你面对一个嵌套结构(比如 ad 用户对象、注册表项、wmi/cim 实例等),而目标命令只接受纯字符串、数字或简单类型时,-expandproperty 就是关键桥梁。
什么时候必须用 ExpandProperty?
常见于以下三类场景:
- 上游输出是完整对象(如
ADComputer、ADUser、CimInstance),但下游参数只认字符串或标量值(如-ComputerName、-Identity、-Path) - 注册表项的
Property属性本身是一个字符串数组(如"Path", "ProductName"),但你想直接列出这些名称,而不是显示整个Property属性对象 - 从
Get-ADUser -Properties MemberOf获取的MemberOf是 DN 字符串数组,但传给Get-ADGroup时若不展开,PowerShell 会尝试匹配对象属性而非字符串值,导致报错
怎么正确使用 ExpandProperty?
语法固定:Select-Object -ExpandProperty <propertyname></propertyname>。注意三点:
- 只能指定一个属性名,不能写多个(如
-ExpandProperty Name, DistinguishedName会失败) - 属性名必须真实存在且可访问;例如
Get-ADComputer对象有Name属性,但没有Hostname属性 - 展开后结果是纯值流:如果是单个值,就是那个值;如果是多个值(如 10 台计算机),就输出 10 个独立字符串,可被管道自然接收
典型写法示例:
Get-ADComputer -Filter * | Select-Object -ExpandProperty Name | Test-Connection
Get-Item HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion | Select-Object -ExpandProperty Property
Get-ADUser Ty -Properties MemberOf | Select-Object -ExpandProperty MemberOf | Get-ADGroup
ExpandProperty 和 Property 的区别
很多人混淆 Select-Object -Property Name 和 -ExpandProperty Name:
-
-Property Name输出的是一个新对象,里面只有Name这个属性——它仍是ADComputer类型的对象,只是字段变少了 -
-ExpandProperty Name输出的是Name属性的内容本身,比如"DC01"或"Workstation001",类型是[string] - 你可以用
.GetType()验证:前者返回Selected.Microsoft.ActiveDirectory.Management.ADComputer,后者返回System.String
配合其他操作提升实用性
ExpandProperty 经常不是单独使用,而是和过滤、错误处理组合:
- 排除空值:
Get-ADUser -Filter * -Properties MemberOf | Where-Object MemberOf | Select-Object -ExpandProperty MemberOf - 去重并排序:
Get-ADUser -Filter * -Properties Department | Select-Object -ExpandProperty Department | Sort-Object -Unique - 安全读取注册表(防路径不存在):
if (Test-Path HKLM:\SOFTWARE\MyApp) { Get-Item HKLM:\SOFTWARE\MyApp | Select-Object -ExpandProperty Property }











