如何总计几个文件的Kbytes

时间:2011-01-11 18:00:50

标签: powershell

我正在遍历一个充满文件的目录,需要获取目录中所有文件的总数。但是由于我获取/计算千字节的方式,我遇到了转换问题。

这是我的代码:

$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 个答案:

答案 0 :(得分:3)

直接回答:

好的,首先我要回答一下你的代码为何会出现错误的问题。基本上,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 cmdlet可以免费执行此类操作:

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

希望有所帮助