【问题标题】:Write loop using ForEach intead of pipe and %使用 ForEach 而不是 pipe 和 % 编写循环
【发布时间】:2021-12-11 10:13:45
【问题描述】:

我有以下代码用于提取有关我的AzADServicePrincipals 的信息。现在,我找到了一个使用这样的管道的代码:

$APPs = Get-AzADApplication
    $SPs = Get-AzADServicePrincipal
    
    $appCreds = @()
    $appCreds += $APPs | Sort-Object -Property DisplayName | % {
        $app = $_
        $sp = $SPs | ? ApplicationId -eq $cred.ApplicationId
        New-MyQLogEntry -Severity DEBUG -Message "'Fetching information for application {0}' -f $app.DisplayName"
        $app | Get-AzADAppCredential -ErrorAction SilentlyContinue | Select-Object -Property @{Name='DisplayName'; Expression={$app.DisplayName}}, @{Name='ObjectId'; Expression={$app.Id}}, @{Name='ApplicationId'; Expression={$app.ApplicationId}}, @{Name='UsedIn'; Expression={$app.ReplyUrls}}, @{Name='KeyId'; Expression={$_.KeyId}}, @{Name='Type'; Expression={$_.Type}}, @{Name='StartDate'; Expression={$_.StartDate -as [datetime]}}, @{Name='EndDate'; Expression={$_.EndDate -as [datetime]}}
    }

改编自:https://github.com/slapointe/azure-scripts/blob/master/azure-ad/expiring-app-credentials/Get-AzADAppExpiringCredentials.ps1

我正在尝试将其转换为 foreach 循环,但我无法做到。

代码背景: Get-AzADApplication 将为您提供 Azure 帐户中的所有应用程序,我正在尝试查找所有类型的应用程序:服务主体(基于应用程序 Id 匹配),然后将所有属性合并到一个对象中(此处为 $appCreds 在此实例中)

【问题讨论】:

    标签: powershell foreach azure-devops azure-powershell azure-service-principal


    【解决方案1】:
    • 我假设$cred.ApplicationId 是一个错字,因为原始代码使用的是:
    $application = $_
    $application.ApplicationId
    
    • 下面的行没有理由存在,变量$sp 没有在其他任何地方使用(不是这里也不是原始代码),但如果它会被使用,我肯定会改变它hashtable
    $sp = $SPs | ? ApplicationId -eq $cred.ApplicationId`
    

    在我看来,下面是更经典且肯定更高效的代码的样子:

    $APPs = Get-AzADApplication
    $SPs = Get-AzADServicePrincipal
    
    $appCreds = foreach($app in $APPs | Sort-Object DisplayName)
    {
        New-MyQLogEntry -Severity DEBUG -Message ('Fetching information for application {0}' -f $app.DisplayName)
        if($azAppCreds = Get-AzADAppCredential -ObjectId $app.ObjectId -ErrorAction SilentlyContinue)
        {
            foreach($cred in $azAppCreds)
            {
                [pscustomobject]@{
                    DisplayName = $app.DisplayName
                    ObjectId = $app.Id
                    ApplicationId = $app.ApplicationId
                    UsedIn = $app.ReplyUrls
                    KeyId = $cred.KeyId
                    Type = $cred.Type
                    StartDate = $cred.StartDate -as [datetime]
                    EndDate = $cred.EndDate -as [datetime]
                }
            }
        }   
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-05
      • 1970-01-01
      • 2012-01-27
      • 2014-10-23
      • 2020-07-13
      • 2010-11-09
      • 1970-01-01
      相关资源
      最近更新 更多