PowerShell自定义pscustomobject中集成Measure-Object的使用问题
问题根因
你的原有脚本无法正确统计文件夹大小,核心问题出在size=measure-object -sum -property length这行:
- 没有给
Measure-Object传入待统计的文件集合,命令找不到要计算长度的目标对象 - 没有提取命令返回结果的具体数值,
Measure-Object执行后会返回一个包含Count、Sum、Average等属性的统计对象,直接赋值会把整个对象存入size字段,不是你要的大小数值
自定义对象中集成Measure-Object的可行性
完全可以。PowerShell支持在[pscustomobject]的属性赋值位置直接执行命令,只要用括号包裹命令表达式,将命令返回的目标属性值赋值给对应字段即可。
修正后的可运行脚本
以下脚本和你原有逻辑对齐,统计D盘下深度2以内的所有文件夹,返回完整路径、当前文件夹根目录下的文件总数、当前文件夹根目录下的文件总大小(单位:字节),最后按文件总数倒序排列:
Get-ChildItem d:\ -Directory -Recurse -Depth 2 -ErrorAction SilentlyContinue | ForEach-Object{ [pscustomobject]@{ FullName = $_.Fullname FileCount = $_.GetFiles().Count # 传入当前文件夹下的文件集合给Measure-Object,提取Sum属性为总大小 Size = ($_.GetFiles() | Measure-Object -Sum -Property Length).Sum } } | Sort-Object -Property FileCount -Descending
可选调整
- 如果需要统计包含所有嵌套子文件夹在内的总文件数、总大小,把两个
$_.GetFiles()替换为$_.GetFiles('*', [System.IO.SearchOption]::AllDirectories)即可 - 如果需要把大小转为易读的GB单位,将Size行替换为以下内容(保留2位小数):
Size = [math]::Round(($_.GetFiles() | Measure-Object -Sum -Property Length).Sum / 1GB, 2) - 如果需要忽略单个文件夹访问权限报错,可以在获取文件时加上错误静默参数,例如把Size行的文件获取部分替换为
Get-ChildItem -Path $_.FullName -File -Recurse -ErrorAction SilentlyContinue
内容的提问来源于stack exchange,提问作者thomas delepaut
相关产品推荐
相关产品推荐

