2011-01-11 2 views
1

私はファイルがいっぱいのディレクトリをループしており、ディレクトリ内のすべてのファイルの合計を取得する必要があります。しかし、キロバイトをフェッチ/計算する方法のために変換の問題が発生しています。ここでいくつかのファイルの合計Kバイト数

が私のコードです:私はこれを実行すると

$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

直接の答え:

[OK]を、最初に私はあなたのコードは、そのエラーを取得している理由について、あなたの質問にお答えします。基本的にSelect-Objectは、KBytesプロパティを持つオブジェクトを返しています。そのオブジェクトは、$totalfilesizeに追加しようとしているオブジェクトです。これには2通りの方法があります:

1つのオプションは、必要な値を出力するためにforeachを使用することです。

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

これを試してみてください、あなたはそれが唯一のintで$ _。長さを、返送ているため、結果は、int型で表示されます。

Alternatvely、あなたの代わりに選択し、オブジェクトの結果を追加する.KBytesプロパティを追加することができます。

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


警告

あなたは、複数のファイルを反復処理するために計画しています?もしそうなら、問題が発生する可能性があります。その場合、配列を返すことになるからです。あなたが得る-ChildItemコマンドレットの結果に基づいて、ループに加えて移動することによって、これを避けることができます。

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

:最後に

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

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

    Write-Host $totalfilesize 

を、自由のためのこのようなものを行う測定-Objectコマンドレットがあります

希望があれば

+0

ありがとう!この$ totalfilesize + = $ filesize.Kbytesを使用するのは、まさに私が必要とするものです。 「ForEach-Object」オプションが機能しないように、各ディレクトリ内の特定のファイルのみを集計しています。助けを感謝します! – ProfessionalAmateur

関連する問題