在 For Each 语句中过滤 Powershell 结果

Filtering Powershell result in For Each statement

我已经编写(或至少尝试编写)一个简单的脚本来获取分配给特定 Azure AD 组的所有 Microsoft Intune Defender 策略。

脚本获取所有 Defender 策略,找到链接到这些策略的组 ID,然后使用 Get-AzureADGroup 获取实际名称。

现在我需要找到一种方法来仅显示与特定组名匹配的策略(硬编码)。在脚本的顶部,我有一个带有组名的变量。我只是找不到如何过滤所有 $intent(s) 以仅显示链接到组名称变量的方法。

Connect-MSGraph -ForceInteractive
Update-MSGraphEnvironment -SchemaVersion beta
Connect-MSGraph
Connect-AzureAD

$groupname = "group-name-here"

$intents = Invoke-MSGraphRequest -HttpMethod GET -Url "deviceManagement/intents" | Get-MSGraphAllPages


 foreach ($intent in $intents) {
        $PolicyID = Invoke-MSGraphRequest -HttpMethod GET -Url "deviceManagement/intents/$($intent.Id)/assignments"
        $AssignmentGroupIDs = $PolicyID.value.target.groupID

            foreach ($AssignmentGroupID in $AssignmentGroupIDs) {
                $AssignmentGroupName = Get-AzureADGroup -ObjectId $AssignmentGroupID

            }
        }


Write-Host "Number of policies found: $($intents.Id.Count)" -ForegroundColor cyan
Write-Host $AssignmentGroupName.DisplayName
Write-Host $intent.displayName

您创建但分配给变量的任何值都将成为脚本块输出的一部分。这意味着您可以这样做:

$result = foreach (...) {
     if (condition) {
         $value
     }
}

$result 将包含循环中的所有 $value

在上下文中(未经测试,但你明白了):

$matchingIntents = foreach ($intent in $intents) {
    $PolicyID = Invoke-MSGraphRequest -HttpMethod GET -Url "deviceManagement/intents/$($intent.Id)/assignments"
    $AssignmentGroupIDs = $PolicyID.value.target.groupID
    foreach ($AssignmentGroupID in $AssignmentGroupIDs) {
        $AssignmentGroupName = Get-AzureADGroup -ObjectId $AssignmentGroupID
        if ($AssignmentGroupName -eq $groupname) {
            $intent
            break
        }
    }
}