2

我在“ Windows PowerShell Tip of the Week ”中提供了一个稍微修改过的脚本版本。这个想法是确定文件夹及其子文件夹的大小:

$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

此错误的原因是什么以及如何改进脚本以克服?

4

2 回答 2

4

您可以将-ErrorAction参数用于Measure-Object

$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
于 2012-06-13T08:59:37.463 回答
-1

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

于 2012-06-13T08:42:22.393 回答