Прямой ответ:
Хорошо, сначала я просто отвечу на ваш вопрос о том, почему ваш код получает такую ошибку. По сути, 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)
Надеюсь, это поможет