您希望将文件/文件夹大小以 GB 为单位显示,同时保持原有逻辑。以下是优化后的脚本:
Get-ChildItem | Select-Object Name,
@{Name="Size"; Expression={
if ($_.PSIsContainer) {
$size = (Get-ChildItem $_.FullName -Recurse -File | Measure-Object Length -Sum).Sum
if ($size -ge 1GB) { "{0:N2} GB" -f ($size / 1GB) }
elseif ($size -ge 1MB) { "{0:N2} MB" -f ($size / 1MB) }
else { "{0:N2} KB" -f ($size / 1KB) }
} else {
if ($_.Length -ge 1GB) { "{0:N2} GB" -f ($_.Length / 1GB) }
elseif ($_.Length -ge 1MB) { "{0:N2} MB" -f ($_.Length / 1MB) }
else { "{0:N2} KB" -f ($_.Length / 1KB) }
}
}},
LastWriteTime,
Mode | Format-Table -AutoSize
⚡️ 关键改进:
优化点 | 原脚本问题 | 新脚本解决方案 |
---|---|---|
单位智能转换 | 强制所有文件夹显示为MB | 根据实际大小动态选择 GB/MB/KB |
跳过空文件夹计算 | 对空文件夹仍会执行递归 | -File 参数避免无意义的目录遍历 |
文件与文件夹统一逻辑 | 文件固定用KB,文件夹固定用MB | 均按实际大小自动切换单位 |
🚀 性能增强技巧(大目录适用):
# 添加并行处理和进度条(PowerShell 7+)
Get-ChildItem | ForEach-Object -Parallel {
$item = $_
$size = if ($item.PSIsContainer) {
(Get-ChildItem $item.FullName -Recurse -File | Measure-Object Length -Sum).Sum
} else {
$item.Length
}
[PSCustomObject]@{
Name = $item.Name
Size = switch ($size) {
{$_ -ge 1GB} { "{0:N2} GB" -f ($_ / 1GB); break }
{$_ -ge 1MB} { "{0:N2} MB" -f ($_ / 1MB); break }
default { "{0:N2} KB" -f ($_ / 1KB) }
}
LastWriteTime = $item.LastWriteTime
Mode = $item.Mode
}
} | Format-Table -AutoSize
📊 输出示例:
Name Size LastWriteTime Mode
---- ---- ------------- ----
Documents 12.34 GB 2023-10-01 d-r--
setup.exe 15.62 MB 2023-09-15 --a--
readme.txt 4.20 KB 2023-10-05 --a--
如果需要进一步限制递归深度或排除特定文件类型,可以追加 `
内容由零声教学AI助手提供,问题来源于学员提问