如何通过文件夹recursion并确定文件夹大小?

我在“ Windows PowerShell每周提示 ”中提供了一个略有修改的脚本版本。 这个想法是确定一个文件夹及其子文件夹的大小:

$startFolder = "C:\Temp\" $colItems = (Get-ChildItem $startFolder | Measure-Object | Select-Object -ExpandProperty count) "$startFolder -- " + "{0:N2}" -f ($colItems.sum / 1MB) + " MB" $colItems = (Get-ChildItem $startFolder -recurse | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object) foreach ($i in $colItems) { $subFolderItems = (Get-ChildItem $i.FullName | Measure-Object -property length -sum) $i.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum / 1MB) + " MB" } 

这个脚本运行正常,但有一些文件夹,我得到一个错误说:

 Measure-Object : Property "length" cannot be found in any object(s) input. At line:10 char:70 + $subFolderItems = (Get-ChildItem $i.FullName | Measure-Object <<<< -property length -sum) + CategoryInfo : InvalidArgument: (:) [Measure-Object], PSArgumentException + FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand 

这个错误的原因是什么,以及如何改进脚本来克服?

您可以对Measure-Object使用-ErrorAction参数:

 $subFolderItems = (Get-ChildItem $i.FullName | Measure-Object -property length -sum -ErrorAction SilentlyContinue) 

或其别名-ea与数值,这是很好的快速添加交互式实验:

 $subFolderItems = (Get-ChildItem $i.FullName | Measure-Object -property length -sum -ea 0) 

在我看来,Technet上的脚本是非常糟糕的PowerShell代码。

作为一个非常快速和肮脏(和缓慢)的解决方案,你也可以使用下面的一行:

 # Find folders Get-ChildItem -Recurse | Where-Object { $_.PSIsContainer } | # Find cumulative size of the directories and put it into nice objects ForEach-Object { New-Object PSObject -Property @{ Path = $_.FullName Size = [Math]::Round((Get-ChildItem -Recurse $_.FullName | Measure-Object Length -Sum -ErrorAction SilentlyContinue).Sum / 1MB, 2) } } | # Exclude empty directories Where-Object { $_.Size -gt 0 } | # Format nicely Format-Table -AutoSize 

或者实际上作为一个单行:

 gci -r|?{$_.PSIsContainer}|%{New-Object PSObject -p @{Path=$_.FullName;Size=[Math]::Round((gci -r $_.FullName|measure Length -s -ea 0).Sum/1MB,2)}}|?{$_.Size}|ft -a 

我在Windows 7上运行它,它工作(剪切和粘贴你的代码)。 也许在你的路径中有一个“不好的名字”的文件?