PowerShell函数输出按文件夹/文件大小排序求助
问题分析与解决:PowerShell Print-Sizes函数排序无效问题
你的函数排序无效的核心原因是:最终输出的是格式化好的字符串,而非带数值属性的对象。Sort-Object只能基于对象的属性排序,直接操作字符串的话,它只会按文本的字符顺序排序,根本识别不了你要的大小数值。
修改思路
- 先收集每个文件夹的原始大小数值和名称,生成包含这两个属性的自定义对象
- 对对象数组按大小(或名称)排序
- 最后再格式化输出成你需要的字符串格式
修改后的完整代码
function Print-Sizes { # 获取当前目录下所有文件夹(用-Directory替代原Where-Object判断,更简洁) $colItems = Get-ChildItem -Directory # 遍历文件夹,生成包含名称和大小数值的自定义对象 $folderSizes = foreach ($i in $colItems) { # 获取文件夹内所有文件的大小总和(用-File替代原Where-Object判断) $subFolderItems = Get-ChildItem $i.FullName -Recurse -Force -File | Measure-Object -Property Length -Sum # 创建自定义对象,保留原始数值用于排序 [PSCustomObject]@{ FolderName = $i.Name SizeInMB = $subFolderItems.Sum / 1MB } } # 按大小降序排序(去掉-Descending就是升序),再格式化输出 $folderSizes | Sort-Object -Property SizeInMB -Descending | ForEach-Object { '{0:N2} MB | {1}' -f $_.SizeInMB, $_.FolderName } }
关键说明
- 用
[PSCustomObject]创建带属性的对象,让Sort-Object能识别SizeInMB这个数值属性进行排序 - 原代码里的
$startFolder变量未定义,默认会使用当前目录,所以直接用Get-ChildItem -Directory即可 - 替换了原代码中繁琐的
Where-Object判断,用PowerShell内置的-Directory和-File参数更高效 - 如果需要按文件夹名称排序,只需把
Sort-Object -Property SizeInMB -Descending改成Sort-Object -Property FolderName
内容的提问来源于stack exchange,提问作者Evellyn
相关产品推荐
相关产品推荐

