Как подсчитать килобайты нескольких файлов - PullRequest
1 голос
/ 11 января 2011

Я перебираю каталог, полный файлов, и мне нужно получить общую сумму всех файлов в каталоге. Однако у меня проблема с преобразованием из-за способа извлечения / вычисления килобайтов.

Вот мой код:

$destinationDir = "\\server\folder"
$filename = "FILE_1234567.xls"
$filesize = 0
$totalfilesize = 0

$filesize = Get-ChildItem ($destinationDir + "\" + $filename) | Select-Object @{Name="Kbytes";Expression={"{0:N0}" -f ($_.Length / 1Kb)}}
$totalfilesize += [int]($filesize)

Write-Host $filesize
Write-Host $totalfilesize

Однако, когда я запускаю это, я получаю следующее сообщение об ошибке:

Cannot convert the "@{Kbytes=93}" value of type "Selected.System.IO.FileInfo" to type "System.Int32".
At C:\Sample.ps1:7 char:18
+ $totalfilesize += <<<<  $filesize
+ CategoryInfo          : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException

Я довольно новичок в Powershell, но, похоже, я не могу привести $filesize к целому числу для суммирования. Может кто-нибудь помочь с тем, где я ошибся?

1 Ответ

3 голосов
/ 11 января 2011

Прямой ответ:

Хорошо, сначала я просто отвечу на ваш вопрос о том, почему ваш код получает такую ​​ошибку. По сути, Select-Object возвращает объект, имеющий свойство KBytes - этот объект является тем, что вы пытаетесь добавить к $totalfilesize. Есть два способа обойти это:

Один из вариантов - использовать foreach для выдачи желаемого значения.

$filesize = Get-ChildItem ($destinationDir + "\" + $filename) | ForEach-Object { $_.Length / 1kb }

Попробуйте это, и вы увидите, что результатом является int, потому что он возвращает только $ _. Length, который является int.

Кроме того, вы можете добавить свойство .KBytes вместо добавления результата Select-Object:

$totalfilesize += [int]($filesize.KBytes)


Протест

Планируете ли вы перебирать несколько файлов? Если это так, то вы можете столкнуться с проблемами, потому что в этом случае вы получите массив обратно. Этого можно избежать, переместив дополнение в цикл на основе результатов get-childitem:

 $destinationDir = "$pshome"
 $filename = "*"
 $totalfilesize = 0

 $filesize = Get-ChildItem ($destinationDir + "\" + $filename) | ForEach-Object {           $totalfilesize += $_.Length / 1kb }

  Write-Host $totalfilesize

Наконец, есть командлет Measure-Object, который делает такие вещи бесплатно:

[int]((Get-ChildItem $PSHOME | Measure-Object -Sum Length).Sum / 1kb)

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...