2012-02-14 3 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

+0

Вам не хватает {в блоке Where-Object, который вы разместили тоже. – EBGreen

+0

Это была подсказка PowerShell на неделе lol ... http://technet.microsoft.com/en-us/library/ff730945.aspx –

ответ

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

+0

Спасибо, что указали это. Исправлено. – EBGreen

0

Вопрос заключается в том, что выход Get-ChildItem составляет $ NULL для пустых папок. Объект 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" 
    } 

Теперь нет никакой ошибки, и значения являются точными.

Смежные вопросы