PowerShell中使用Add-Member带表达式赋值失败问题咨询
PowerShell中Add-Member无法求值表达式的原因及解决方法
问题根源
你用Select-Object的计算属性能正常工作,是因为它的E={$_.Name}是针对管道中每个对象执行的脚本块,$_会正确绑定到当前遍历的对象。
而Add-Member的-NotePropertyValue参数不支持脚本块——你写的$_.Name会在调用Add-Member之前就被求值,这个上下文里的$_根本不是数组里的对象(要么是null,要么是之前管道操作的残留值),所以最终每个对象的CopyName会被设为无效值,达不到预期效果。
正确实现方式
要给数组里的每个对象添加基于自身属性的成员,得用ForEach-Object遍历,在它的脚本块里操作,此时$_才会正确指代当前对象:
$testData | ForEach-Object { $_ | Add-Member -NotePropertyName "CopyName" -NotePropertyValue $_.Name } $testData
或者在PowerShell 5.1及以上(包括7),可以更直接地给属性赋值,写法更简洁:
$testData | ForEach-Object { $_.CopyName = $_.Name }
额外说明
- 用
Select-Object是生成新对象,不会改动原数组里的对象;而上面两种方法是直接修改原对象,这是两者的核心差异。 - 处理数组对象时,一定要确保针对每个单独对象执行属性操作,否则无法正确绑定
$_到目标对象。
内容的提问来源于stack exchange,提问作者codeulike
相关产品推荐
相关产品推荐

