递归获取文件夹及子文件夹相对路径与大小问题求助
问题原因及解决方法
你的脚本存在两个核心问题导致无法获取文件夹大小:
- 变量名笔误:
$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
相关产品推荐
相关产品推荐

