在PowerShell中合并数组中的对象

时间:2019-02-26 10:21:36

标签: powershell

我的PowerShell脚本的一部分有些许障碍。

我有一个数组,其中包含用户的电子邮件地址及其合规状态。同一个用户在多个策略中可能在数组中具有多个条目。

例如:

Username: User1, State: OK
Username: User1, State: Not OK
Username: User1, State: OK
Username: User 2, State: OK
Username: User 2, State: OK

我需要做的是合并每个用户的所有条目,然后将其总体状态写入屏幕。如果所有状态均为OK,则报告OK,但是如果Not OK处于其任何状态,则报告Not OK。例如:

User 1 - Not OK
User 2 - OK

任何指导表示赞赏。下面是我的代码:

foreach ($Listing in $FullProtectionStatus) {
    if ($listing.state -eq "compliant") {
        Write-Host $Listing.userPrincipalName "compliant"
    }
    if ($Listing.state -eq "non compliant") {
        Write-Host $Listing.userPrincipalName "not compliant" -ForegroundColor Red
    }
}

2 个答案:

答案 0 :(得分:4)

您可以按用户名对对象进行分组,然后检查每个组是否包含“不正常”状态。

$FullProtectionStatus |
    Select-Object Username, State -Unique |
    Group-Object Username |
    Select-Object @{n='Username';e={$_.Name}}, @{n='State';e={
        $_.Group |
            Select-Object -Expand State |
            Sort-Object |
            Select-Object -First 1
    }}

答案 1 :(得分:1)

由于两个If条件,您在foreach内部的验证需要改进。要么是else条件,要么是elseif。同样,迭代每个用户并解析条件。

ForEach($Listing in $FullProtectionStatus) 
{ 
    If($listing.state -eq "compliant") 
    { 
    Write-host $Listing.userPrincipalName "compliant" 
    } 
    elseif($Listing.state -eq "non compliant") 
    { 
    Write-host $Listing.userPrincipalName "not compliant" -ForegroundColor Red 
    }
}