Ошибка размера каталога - PullRequest
       6

Ошибка размера каталога

3 голосов
/ 14 февраля 2012

У меня есть скрипт для проверки размера папки и всех ее подпапок, и он делает то, что мне нужно, но выдает ошибки, если папка имеет размер 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"
}

Ответы [ 3 ]

3 голосов
/ 09 ноября 2015

Наконец я получил это.Ошибка возникает, когда в одной папке нет файла, даже если в нем есть непустые папки.Решение, опубликованное 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"
    }

Теперь ошибки нет, а значения точные.

2 голосов
/ 15 февраля 2012

у меня это работало без ошибок:

$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 голосов
/ 15 февраля 2012

Проблема в том, что вывод 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"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...