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

递归获取文件夹及子文件夹相对路径与大小问题求助

问题原因及解决方法

你的脚本存在两个核心问题导致无法获取文件夹大小:

  • 变量名笔误:$f_ 应为 $f,但更关键的是文件夹对象本身没有Length属性——Length是文件对象的专属属性,文件夹的实际大小需要递归计算其包含的所有文件(含子文件夹内文件)的大小总和。

修正后的脚本如下:

$srcpth = "C:\Program Files\Microsoft SQL Server" 
$files = Get-ChildItem -Path $srcpth -Directory -Recurse
$result = foreach ($f in $files) {
    # 计算当前文件夹下所有文件的总大小(递归包含子文件)
    $totalSize = (Get-ChildItem -Path $f.FullName -File -Recurse | Measure-Object -Property Length -Sum).Sum
    [pscustomobject][ordered]@{
        RelativePath = $f.FullName.Remove(0, $srcpth.Length)
        # 转换为KB单位并保留1位小数,空文件夹显示0.0
        FileSize     = '{0:N1}' -f ($totalSize / 1KB)
    }
}
$result | Export-Csv "c:\files\o2.csv" -NoTypeInformation

关键修改说明:

  • 新增$totalSize变量:通过Get-ChildItem -File -Recurse获取文件夹内所有文件,再用Measure-Object求和文件的Length属性,得到文件夹总大小(字节)。
  • 修正变量名:将错误的$f_改为循环变量$f(该笔误不影响核心问题,但需修正以避免其他错误)。
  • 添加-NoTypeInformation参数:导出CSV时避免生成不必要的类型信息行。

如果需要更快的计算速度(适用于大型目录),可以使用性能更优的[System.IO.Directory]::EnumerateFiles()方法:

$srcpth = "C:\Program Files\Microsoft SQL Server" 
$files = Get-ChildItem -Path $srcpth -Directory -Recurse
$result = foreach ($f in $files) {
    $totalSize = 0
    # 枚举所有文件并累加大小
    foreach ($file in [System.IO.Directory]::EnumerateFiles($f.FullName, "*", [System.IO.SearchOption]::AllDirectories)) {
        $totalSize += (Get-Item $file).Length
    }
    [pscustomobject][ordered]@{
        RelativePath = $f.FullName.Remove(0, $srcpth.Length)
        FileSize     = '{0:N1}' -f ($totalSize / 1KB)
    }
}
$result | Export-Csv "c:\files\o2.csv" -NoTypeInformation

内容的提问来源于stack exchange,提问作者karthik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:20:37