Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 如何将foreach循环中的值转换为求和?_Powershell_Foreach - Fatal编程技术网

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"