我正在遍历一个充满文件的目录,需要获取目录中所有文件的总数。但是由于我获取/计算千字节的方式,我遇到了转换问题。
这是我的代码:
$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
强制转换为整数。任何人都可以帮到我出错的地方吗?
答案 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)
希望有所帮助