powershell提取嵌套属性值的核心是将对象内部属性“展开”为可直接使用的标量值;常用select-object -expandproperty抽取单个属性,点号语法($_.prop.subprop)适用于已知结构的浅层嵌套,convertfrom-json/csv用于解析文本型嵌套数据,计算属性则支持组合、转换等复杂场景。
powershell 对象管道提取嵌套属性值,核心是把封装在对象内部的“值”真正“拿出来”,变成能被下游命令直接使用的标量(如字符串、数字),而不是保留它作为某个属性的对象包装体。
用 Select-Object -ExpandProperty 抽出单个属性值
这是最常用、最直接的方式。它不生成新对象,而是将指定属性的原始值逐个输出到管道。
- 语法固定:Select-Object -ExpandProperty PropertyName,只能写一个属性名
- 适用场景:上游是完整对象(如
Get-ADUser、Get-CimInstance、Get-ItemProperty),下游参数只接受字符串(如-Identity、-ComputerName) - 例子:
Get-ADComputer -Filter * | Select-Object -ExpandProperty Name | Test-Connection—— 把每台计算机的Name提成纯字符串,交给Test-Connection - 注意:如果属性本身是数组(如
MemberOf),展开后会输出多个独立字符串,自然支持管道批量处理
用点号(.)语法直接访问嵌套层级
当对象结构已知且层级较浅时,可在脚本块中用 $_.PropertyName.SubProperty 直接取值。
Windows 命令行编码与兼容规范。涵盖 GBK/UTF-8 编码、PowerShell/pwsh 互操作、Python/Node.js、Git 配置及代码生成规则。适用于 Windows 10/11 + MSYS2/Git Bash 环境下的所有命令行操作。
- 适用于
ForEach-Object、Where-Object或赋值语句中 - 例子:
Get-ADUser Ty -Properties MemberOf | ForEach-Object { $_.MemberOf[0] }—— 取第一个组 DN - 也可结合计算属性使用:
Select-Object @{Name='GroupName'; Expression={$_.MemberOf.Split(',')[0].Split('=')[1]}} - 优势:灵活,支持索引、方法调用(如
.ToString())、字符串操作等
用 ConvertFrom-Json / ConvertFrom-Csv 解析文本型嵌套数据
当嵌套结构以 JSON 或 CSV 字符串形式存在(如 API 返回、日志内容),需先解析再取值。
-
Invoke-RestMethod默认已解析 JSON,返回的是原生 PowerShell 对象,可直接用点号访问:$api.host.ip - 若拿到的是原始 JSON 字符串(如从
Get-Content读取),需先ConvertFrom-Json:(Get-Content cfg.json | ConvertFrom-Json).database.port - CSV 场景类似:
Import-Csv data.csv | ForEach-Object {$_.Status},或先ConvertFrom-Csv再点取
用哈希表或计算属性构造新字段并提取
当需要组合多个属性、做逻辑判断或格式转换时,计算属性是更可控的方式。
- 语法:
Select-Object @{Name='NewName'; Expression={...}} - Expression 中可写任意脚本块,包括嵌套取值、条件判断、类型转换等
- 例子:
Get-Process | Select-Object Name, @{Name='MemMB'; Expression={[math]::Round($_.WorkingSet64/1MB, 2)}} - 适合替代复杂
ForEach-Object,同时保持管道流式处理










