2012-02-14 98 views
3

我有一个脚本来检查一个文件夹及其所有子文件夹的大小,它做我需要的但它会抛出错误,如果该文件夹的大小为0.我想添加一些逻辑但我似乎找不到一个很好的方法来做到这一点,在此先感谢您的帮助。目录大小错误

的脚本是:

$startFolder = "C:\" 

$colItems = (Get-ChildItem $startFolder | Measure-Object -property length -sum) 
"$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" 
} 
+0

它抛出了什么错误?在哪一行?添加逻辑来做什么? – EBGreen 2012-02-14 19:25:47

+0

您在发布的Where-Object模块上缺少{{}。 – EBGreen 2012-02-14 19:27:10

+0

这是一周PowerShell提示大声笑... http://technet.microsoft.com/en-us/library/ff730945.aspx – 2012-02-14 19:29:11

回答

2

这个工作对我来说没有错误:

$startFolder = "C:\" 

$colItems = (Get-ChildItem $startFolder | Measure-Object -property length -sum) 
"$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 -ErrorAction SilentlyContinue) 
    $i.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum/1MB) + " MB" 
} 
+0

这需要一个开头{在行中:$ colItems =(Get-ChildItem $ startFolder -recurse | Where-Object – Robin 2013-11-25 16:36:21

+0

感谢您指出这一点。 – EBGreen 2013-11-25 17:29:19

0

的问题是,Get-ChildItem输出为$空的空文件夹。 Measure-Object期待具有长度属性的输入对象。所以你可以忽略文件夹的处理是这样的:

foreach ($i in $colItems) 
{ 
    if ($i.GetFileSystemInfos().Count) { 
     $subFolderItems = (Get-ChildItem $i.FullName | Measure-Object -property length -sum) 
     $i.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum/1MB) + " MB" 
    } 
} 
3

最后我得到了这个。当一个文件夹没有文件时,即使它具有非空文件夹,也会发生错误。 EBGreen发布的解决方案不完整,因为它仅考虑子文件。

正确的脚本是:

$folder = $args[0] 
[console]::WriteLine($folder) 
$startFolder = $folder 

#here we need the size of all subfiles and subfolders. Notice the -Recurse 
$colItems = (Get-ChildItem $startFolder -Recurse | Measure-Object -property length -sum) 
"$startFolder -- " + "{0:N2}" -f ($colItems.sum/1MB) + " MB" 
"------" 

#here we take only the first level subfolders. Notice the Where-Object clause and NO -Recurse 
$colItems = (Get-ChildItem $startFolder | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object) 
foreach ($i in $colItems) 
    { 
     $i.FullName 
     #here we need again the size of all subfiles and subfolders, notice the -Recurse 
     $subFolderItems = (Get-ChildItem $i.FullName -Recurse | Measure-Object -property length -sum) 
     "         -- " + "{0:N2}" -f ($subFolderItems.sum/1MB) + " MB" 
    } 

现在有没有错误,值是准确的。