Powershell 如何将foreach循环中的值转换为求和?
我在Powershell 如何将foreach循环中的值转换为求和?,powershell,foreach,Powershell,Foreach,我在foreach循环中有一个变量,如以下代码段所示,它以MB为单位计算用户的主文件夹大小: $TotalColItems = @() foreach ($user in $ListofUsers) { $colItems = (Get-ChildItem $user.HomeDirectory -Recurse | Measure-Object -Property Length -Sum) Write-Host "`r`n Size of:" $
foreach
循环中有一个变量,如以下代码段所示,它以MB为单位计算用户的主文件夹大小:
$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
变量将其值附加到一个变量,以便获得所有用户目录大小的总和
$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循环之前将
$TotalColItems
声明为全局变量,然后像以前一样递增。因此,只需执行一个Global:TotalColItems=0
,然后将递增器更改为Global:TotalColItems+=$colItems
,如果这对您不起作用,您可以发布完整的foreach循环供我们查看吗?示例中的$TotalColItems
变量被初始化为数组(@)
是数组子表达式运算符),因此它的作用类似于一个。将其初始化为一个数字,您会发现它按预期工作(重命名变量名以实现自我解释):
$TotalColItems+=$colItems
->$TotalColItems+=$colItems.Sum
@MathiasR.Jessen-这样就行了,但我得到的结果是:4199 155090 5095095…变量中有3个值,而不是一个正在运行的总数。首先将0
分配给$TotalColItems
-您已经为它分配了一个空数组,因此,它的行为就像一个数组$colItems只是原始foreach中的一个值。我不认为会有多个$item在它上面运行…除非我遗漏了什么。完整的“foreach”循环编辑的问题。最后一个“写主机”只是为了让我现在能看到它的价值…我不是一个专业的程序员,所以总体来说这看起来很糟糕,我敢肯定。看起来Mathias打败了我,但我已经写了评论,所以。。问题似乎是您正在将$TotalColItems
创建为空数组,您需要将其设置为0,以便它将继续添加到总和中,而不是构建一个包含所有值的数组。谢谢您,先生……非常感谢!它还帮助我学习如何简化代码。快速问题…有没有过这样的情况:foreach循环中的变量及其值在该循环之外不可用?在首次声明它并向其写入值之后,我可以随时引用它吗?我想当Mike在下面引用一个全局变量时,我会感到困惑…在您的示例中,所有内容都在同一个范围内,写入循环中的任何变量仍然可以访问outside@TheCleaner快速编辑,如果你愿意(我没有足够的分数)$HomeDirSizeMB=“{0:N2}”-f($HomeDirSize/1MB)--最好将其保留在小数点后2位……否则我会将其保留到小数点后8位。
$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"