You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:51:34