用PowerShell替换VBScript获取指定路径一级子文件夹大小
实现一级子文件夹大小统计的几种PowerShell方案
下面是几种比直接用FSO更符合PowerShell习惯、或性能更优的实现方式,按需选择:
1. 纯PowerShell原生Cmdlet实现(易读无依赖)
完全用PowerShell内置命令,无额外依赖,代码直观,适合入门:
function Get-FolderSize { param( [Parameter(Mandatory)] [string]$Path ) # 遍历目标路径下的一级子文件夹 Get-ChildItem -Path $Path -Directory | ForEach-Object { # 递归统计文件夹内所有文件的大小总和 $totalBytes = Get-ChildItem -Path $_.FullName -Recurse -File | Measure-Object -Property Length -Sum | Select-Object -ExpandProperty Sum # 输出结构化结果,包含多种单位便于查看 [PSCustomObject]@{ FolderName = $_.Name FullPath = $_.FullName SizeBytes = $totalBytes SizeMB = [math]::Round($totalBytes / 1MB, 2) SizeGB = [math]::Round($totalBytes / 1GB, 2) } } } # 使用示例 Get-FolderSize -Path "C:\"
优点:无外部依赖、跨PowerShell版本兼容、代码易读;缺点:处理超大量文件时,管道开销会导致速度略慢。
2. .NET类直接调用(性能最优)
直接使用.NET的DirectoryInfo和FileInfo类,减少PowerShell管道开销,性能比原生Cmdlet更好,适合处理大文件夹:
function Get-FolderSize { param( [Parameter(Mandatory)] [string]$Path ) $rootDirectory = [System.IO.DirectoryInfo]$Path # 获取一级子文件夹 $rootDirectory.GetDirectories() | ForEach-Object { # 递归枚举所有文件并统计大小 $totalBytes = ($_.GetFiles('*', [System.IO.SearchOption]::AllDirectories) | Measure-Object -Property Length -Sum).Sum [PSCustomObject]@{ FolderName = $_.Name FullPath = $_.FullName SizeBytes = $totalBytes SizeMB = [math]::Round($totalBytes / 1MB, 2) SizeGB = [math]::Round($totalBytes / 1GB, 2) } } }
优点:性能出色、无COM依赖;缺点:需要对.NET类有基础了解,但代码逻辑依然清晰。
3. 兼容原VBS逻辑的FSO实现(最简洁)
如果你习惯原来VBS的FSO逻辑,这个方案代码最简洁,但仅限Windows环境:
function Get-FolderSize { param( [Parameter(Mandatory)] [string]$Path ) $fso = New-Object -ComObject Scripting.FileSystemObject Get-ChildItem -Path $Path -Directory | ForEach-Object { $folder = $fso.GetFolder($_.FullName) [PSCustomObject]@{ FolderName = $_.Name FullPath = $_.FullName SizeBytes = $folder.Size SizeMB = [math]::Round($folder.Size / 1MB, 2) SizeGB = [math]::Round($folder.Size / 1GB, 2) } } # 手动释放COM对象避免内存泄漏 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($fso) | Out-Null }
优点:代码极简、和原VBS逻辑完全对齐;缺点:依赖Windows COM对象,跨平台PowerShell无法使用,且需手动处理COM对象释放。
方案选择建议
- 跨平台需求或追求原生无依赖:选纯Cmdlet或**.NET类**方案
- Windows环境下追求最快开发速度:选FSO方案
- 处理超大文件夹:选**.NET类**方案
内容的提问来源于stack exchange,提问作者LiquidMetal
相关产品推荐
相关产品推荐

