2011-01-11 33 views
1

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

这里是我的代码:

$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以一个整数作为总和。任何人都可以帮助我出错的地方吗?

回答

3

直接回答:

好吧,首先我就回答你,为什么你的代码是收到这个错误的问题。基本上,Select-Object正在返回一个具有KBytes属性的对象 - 该对象是您要添加到$totalfilesize的对象。有两种方法可以解决这个问题:

一种选择是使用一个foreach来发出你想要的值。

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

试试这个,你会看到的结果是int,因为它只有返回$ _。长度,这是一个int。

Alternatvely,你可以添加,而不是添加选择-对象的结果.KBytes属性:

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


买者

你打算遍历多个文件?如果是这样,那么你可能会遇到问题,因为在这种情况下,你会得到一个数组。您可避免通过移动除了进入一个循环基础上的get-childitem结果:

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

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

    Write-Host $totalfilesize 

最后,还有的测量对象cmdlet它确实像这样的东西免费:

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

希望有帮助

+0

谢谢!使用这个$ totalfilesize + = $ filesize.Kbytes正是我需要的。我只在每个目录中总计某些文件,所以'ForEach-Object'选项将不起作用。感谢帮助! – ProfessionalAmateur 2011-01-11 18:35:45

相关问题