2016-11-21 20 views
2

メガバイトでユーザのホームフォルダのサイズを算出し、次のコードで見られるように、私はforeachループ内の変数を持っている:foreachループで値を集計する方法は?

$TotalColItems = @() 
foreach ($user in $ListofUsers) 
{ 
    $colItems = (Get-ChildItem $user.HomeDirectory -Recurse | 
       Measure-Object -Property Length -Sum) 
    Write-Host "`r`n Size of:" $user.HomeDirectory 
    "{0:N2}" -f ($colItems.Sum/1MB) + " MB" 
    $Calculation = "{0:N2}" -f ($colItems.Sum/1MB) + " MB" 
    $TotalColItems += $colItems.Sum 
    $user.HomeDirectory + " = " + $Calculation | Out-File $LogFileName -Append 
    Remove-Item $user.HomeDirectory -Force -Recurse -ErrorAction SilentlyContinue 
    Write-Host "`r`n Removed HomeDirectory: " $user.HomeDirectory 
    Write-Host "`r`n Verifying you want to remove the user: " $user.Name -ForegroundColor Yellow -BackgroundColor Red 
    Write-Host "`r`n" 
    Remove-ADObject $user.DistinguishedName 
    Write-Host $TotalColItems 

しかし、私はすべての合計値を取得する方法を見つけ出すように見えることはできません$colItems私はMBのオフを計算することができます。

私は、ループ内でこれを入れてみました:

$TotalColItems += $colItems 

それが実行されている追加の合計を保持していないので、それは、ループごとに自分自身をリセットします。

ループごとに変数$colItemsを変数に追加して、すべてのユーザーディレクトリサイズの合計を持つことができますか。あなたが探しているものを達成することができ、さまざまな方法の

+2

'$ TotalColItems + = $ colItems' - >' $ TotalColItems + = $ colItems.Sum' –

+0

@ MathiasR.Jessen - そのような仕事はありますが、私は4199 155090 5095095 ...となります。実行中の合計ではなく変数に3つの値があります。 – TheCleaner

+0

'$ TotalColItems'に' 0'を代入することから始めます。空の配列を割り当てたので、配列のようになります。 –

答えて

3

あなたの例で$TotalColItems変数は、アレイ@()が配列部分式演算子である)として初期化されるので、これは、1つのように作用します。 (自己explanatorynessのための変数名を改称)数としてそれを初期化し、あなたが期待どおりに動作します見つける:

$TotalHomeDirSizeMB = 0 
foreach ($user in $ListofUsers) 
{ 
    # Calculate sum of file sizes, grab Sum property value directly 
    $HomeDirSize = (Get-ChildItem $user.HomeDirectory -Recurse | Measure-Object -Property length -sum).Sum 

    # Calculate and store size in MB 
    $HomeDirSizeMB = $HomeDirSize/1MB 
    # Add to cumulative size variable 
    $TotalHomeDirSizeMB += $HomeDirSizeMB 

    # Write results to screen + file  
    Write-Host "`r`n Size of: $($user.HomeDirectory)" 
    Write-Host ("{0:N2} MB" -f $HomeDirSizeMB) 
    "$($user.HomeDirectory) = $HomeDirSizeMB MB" | Out-File $LogFileName -Append 

    # Remove home directory 
    Remove-Item $user.HomeDirectory -Force -Recurse -ErrorAction SilentlyContinue 
    Write-Host "`r`n Removed HomeDirectory: " $user.HomeDirectory 

    # Wait for user to verify deletion from AD, preempt Confirmation if verified 
    Write-Host "`r`n Verifying you want to remove the user: " $user.Name -ForegroundColor Yellow -BackgroundColor Red 
    if((Read-Host -Prompt "y for yes") -eq 'y'){ 
     Remove-ADObject $user.DistinguishedName -Confirm:$false 
    } 
} 

# Write cumulative size to screen 
Write-Host "Removed $TotalHomeDirSizeMB MB" 
+0

サー...ありがとう!コードを単純化することを学ぶのにも役立ちます。 – TheCleaner

+0

簡単な質問... foreachループ内にあった変数とその値がそのループの外部で使用できなくなることはありますか?それが最初に宣言され、値が書き込まれた後、いつでも参照できますか?私は、Mikeがグローバル変数を参照するときに混乱していると思います... – TheCleaner

+1

あなたの例では、すべてが同じスコープにあり、ループ内に書き込まれた変数はまだ外部にアクセス可能です –

-1
$obj = New-Object PSObject { 
Collection = "" 
} 

$colItems = (Get-ChildItem $user.HomeDirectory -Recurse | Measure-Object -Property length -sum) 
Write-Host "`r`n Size of:" $user.HomeDirectory 
"{0:N2}" -f ($colItems.sum/1MB) + " MB" 
$Calculation = "{0:N2}" -f ($colItems.sum/1MB) + " MB" 

Foreach($item in $ColItems) 
{ 
$obj.Collection = $Item 
} 

はこれをテストしていないが、私はそれが動作するはずだと思いますあなたのforeachループを開始してから、あなたのように増分していきます。だからちょうどGlobal:TotalColItems = 0と増分値をGlobal:TotalColItems += $colItemsに変更してもそれがうまくいかない場合は、私たちが見て回るforeachループ全体を投稿できますか?

+0

$ colItemsは、元のforeach内の単一の値です。私はそれに複数の$ itemがあるとは思っていません。何かが欠けていない限り。 – TheCleaner

1

カップルは、しかし、最も簡単なグローバル変数として$TotalColItemsを宣言するために、おそらくです....

+0

完全な "foreach"ループで編集された質問。最終的な "書き込みホスト"はちょうど私が価値が現在であることを見ることができるので...私は貿易によるコーダーではないので、これは一般的にかなり馬鹿だと私は確信しています。 – TheCleaner

+0

まあ、それは私にそれを打つマシアのように見えますが、私はすでにコメントを書いている..それは空の配列として '$ TotalColItems'を作成しているという問題があるように見えるので、代わりに0に設定する必要がありますすべての値の配列を作成するのではなく、合計に加算を続けます。 –

関連する問題