在日常工作中,我经常需要快速了解某个文件夹占用了多少存储空间,特别是当磁盘空间告急时。Windows资源管理器虽然能显示文件夹大小,但需要手动右键属性查看,而且无法一次性查看多个子文件夹的大小对比。于是,我开发了这个PowerShell脚本,它不仅能递归计算文件夹大小,还能用清晰的表格形式展示结果。
这个脚本特别适合以下场景:
相比第三方工具,这个脚本的优势在于:
首先确保你的系统是Windows 7及以上版本,且已启用PowerShell。Win10/Win11通常已内置PowerShell 5.1或更高版本。
创建脚本的步骤:
Get-FolderSize.ps1C:\Scripts注意:首次运行PowerShell脚本可能需要修改执行策略。以管理员身份运行PowerShell,执行:
Set-ExecutionPolicy RemoteSigned
方式一:直接运行
D:\Projects)方式二:拖拽运行
方式三:集成到右键菜单(高级)
code复制Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\shell\Calculate Size]
[HKEY_CLASSES_ROOT\Directory\shell\Calculate Size\command]
@="powershell -ExecutionPolicy Bypass -File \"C:\\Scripts\\Get-FolderSize.ps1\" \"%1\""
.reg文件并导入脚本的核心是递归计算文件夹大小的算法:
powershell复制$folderSize = (Get-ChildItem -Path $folder.FullName -Recurse -Force |
Where-Object { -not $_.PSIsContainer } |
Measure-Object -Property Length -Sum).Sum
这段代码的工作原理:
Get-ChildItem -Recurse获取所有子项Where-Object过滤掉文件夹,只保留文件Measure-Object -Sum计算所有文件大小的总和性能优化点:
-Force参数确保显示隐藏文件-ErrorAction SilentlyContinue忽略无权限访问的文件夹脚本会自动选择最合适的单位显示大小:
powershell复制if ($file.Length -ge 1GB) {
$size = [math]::Round($file.Length / 1GB, 2)
$unit = "GB"
}
elseif ($file.Length -ge 1MB) {
$size = [math]::Round($file.Length / 1MB, 2)
$unit = "MB"
}
...
转换规则:
脚本的输出经过精心设计:
powershell复制$maxNameLength = ($files | ForEach-Object { $_.Name.Length } | Measure-Object -Maximum).Maximum
$namePadding = 50 - [Math]::Min($displayName.Length, 50)
powershell复制$sizePadding = 15 - $item.SizeString.Length
powershell复制Write-Host ("=" * 70) # 生成70个=的分隔线
让脚本支持命令行参数:
powershell复制param(
[string]$path,
[switch]$summaryOnly
)
if (-not $path) {
$path = Read-Host "请输入目录路径"
}
这样可以直接运行:
.\Get-FolderSize.ps1 -path "D:\Data" -summaryOnly
添加结果导出功能:
powershell复制$exportData = $sizeData | Select-Object Name,Size,Unit
$exportData | Export-Csv -Path "report.csv" -NoTypeInformation
对于超大目录,改用.NET方法提升速度:
powershell复制Add-Type @"
using System;
using System.IO;
public class FolderSize {
public static long Calculate(string path) {
DirectoryInfo di = new DirectoryInfo(path);
return di.EnumerateFiles("*", SearchOption.AllDirectories).Sum(fi => fi.Length);
}
}
"@
$totalSize = [FolderSize]::Calculate($path)
问题:出现"无法加载文件,因为在此系统上禁止运行脚本"
解决:
Set-ExecutionPolicy RemoteSigned问题:结果显示"(无法访问)"
原因:权限不足或文件被占用
解决:
问题:大小统计与资源管理器显示不一致
原因:
建议:比较时排除系统文件夹
运行脚本后,可以快速识别出占用空间最大的文件:
code复制VeryLargeFile.iso 4.67 GB
Backup2023.zip 2.89 GB
...
创建计划任务每月运行:
powershell复制$logPath = "C:\Logs\FolderSize_$(Get-Date -Format 'yyyyMM').log"
.\Get-FolderSize.ps1 -path "D:\UserData" | Out-File $logPath
批量检查多个目录:
powershell复制$paths = "C:\Projects","D:\Backups","E:\Media"
foreach ($p in $paths) {
Write-Host "扫描 $p ..."
.\Get-FolderSize.ps1 -path $p -summaryOnly
}
.mp4文件我实际使用中发现,对于超过10万个文件的目录,建议在非工作时间运行,并添加以下参数防止超时:
powershell复制$ProgressPreference = 'SilentlyContinue'
$ErrorActionPreference = 'SilentlyContinue'