如何为PowerShell中Measure-Object的结果添加文件名属性?
问题分析与解决
为什么执行后无结果?
Add-Member默认不会将修改后的对象输出到管道中,所以你的foreach循环没有产生任何可赋值给$a的输出,最终$a为空。
解决方法1:添加-PassThru参数
给Add-Member加上-PassThru参数,它会把修改后的对象返回,这样循环结果就能被收集到$a里:
$names = Get-ChildItem -Name $a = foreach($name in $names) { Get-ChildItem $name | Measure-Object -Property Length -Sum | Add-Member -MemberType NoteProperty -Name Name -Value $name -PassThru }
解决方法2:直接创建自定义对象(更灵活)
跳过Add-Member,直接构造包含所需属性的自定义对象,可读性和可控性更强:
$names = Get-ChildItem -Name $a = foreach($name in $names) { $measureResult = Get-ChildItem $name | Measure-Object -Property Length -Sum [PSCustomObject]@{ Name = $name Count = $measureResult.Count Sum = $measureResult.Sum Average = $measureResult.Average Max = $measureResult.Maximum Min = $measureResult.Minimum } }
解决方法3:用Select-Object生成计算属性
通过Select-Object的计算属性功能,直接合并原测量结果和自定义的Name属性:
$names = Get-ChildItem -Name $a = foreach($name in $names) { Get-ChildItem $name | Measure-Object -Property Length -Sum | Select-Object *, @{Name='Name'; Expression={$name}} }
内容的提问来源于stack exchange,提问作者ITDecrypted
相关产品推荐
相关产品推荐

