Home > Mobile >  Report confusion. without = Trying to deal with $null
Report confusion. without = Trying to deal with $null

Time:09-17

I run an all users command for calendar delegation. I then report. The issue is how do I include someone that has no calendar delegation ? (Code Below)

In this line If ($null -ne $DelegateCal) I make sure someone has calendar delegation then build the object.

If I don't use = I am not sure how to build the object when I add a Else for the $null

<#All Google Calendar delegate report#>
# filename function
Import-Module C:\tasks\Modules\MRNAP\MRNAP.psm1

$AllGoogleUsers = gam print users fields suspended  | ConvertFrom-Csv | Where-Object { $_.suspended -eq $False } | Select-Object -ExpandProperty PrimaryEmail

ForEach ($UserEmail in $AllGoogleUsers) {

    $DelegateCal = gam calendar $UserEmail print acls | convertfrom-csv | Where-Object { $_.'scope.type' -eq 'user' -and $_.'Scope.value' -ne $UserEmail } -ErrorAction SilentlyContinue
    
    If ($null -ne $DelegateCal) {
        $CalendarDelegateList = foreach ($line in $DelegateCal) {
            [PSCustomObject]@{
                Owner    = $line.calendarId
                Type     = 'Calendar'
                Delegate = $line.'scope.value'
                Role     = $line.role
            }
        }
    }
}

$CalendarDelegateList = $CalendarDelegateList | Sort-Object -Property Owner

$filename = MRNAP -ReportName WhoIsCalendarDelegated -Move
 
$CalendarDelegateLis | Export-Csv $filename -NoTypeInformation | Format-Table text-align=left -AutoSize

This is how I would do it with =

$AllGoogleUsers = gam print users fields suspended  | ConvertFrom-Csv | Where-Object { $_.suspended -eq $False } | Select-Object -ExpandProperty PrimaryEmail

ForEach ($UserEmail in $AllGoogleUsers) {

    $DelegateCal = gam calendar $UserEmail print acls | convertfrom-csv | Where-Object { $_.'scope.type' -eq 'user' -and $_.'Scope.value' -ne $UserEmail } -ErrorAction SilentlyContinue
    
    If ($null -ne $DelegateCal) {
        foreach ($line in $DelegateCal) {
            $CalendarDelegateList  = [PSCustomObject]@{
                Owner     = $UserEmail
                Type      = 'Calendar'
                Delegate = $line.'scope.value'
                Role     = $line.role
            }
        }
    }
    Else {
        $CalendarDelegateList  = [PSCustomObject]@{
            Owner     = $UserEmail
            Type      = 'Calendar'
            Delegate = 'None'
            Role     = 'None'
        }
    }
}

CodePudding user response:

It is always preferable to let PowerShell collect statement output in an array for you rather than building a list of outputs manually - both for concision and performance; see this answer for more information.

This even works with nested foreach loops, as in your case.

Applied to your scenario (abridged):

[array] $CalendarDelegateList = 
  foreach ($UserEmail in $AllGoogleUsers) {
    $DelegateCal = gam calendar $UserEmail print acls | ConvertFrom-Csv | Where-Object { $_.'scope.type' -eq 'user' -and $_.'Scope.value' -ne $UserEmail } -ErrorAction SilentlyContinue      
    If ($null -ne $DelegateCal) {
      foreach ($line in $DelegateCal) {
        # Construct *and ouput* a [pscustomobject] instance.
        [PSCustomObject]@{
          Owner = $UserEmail
          # ...
        }
      }
    }
    Else {
      [PSCustomObject]@{
        Owner = $UserEmail
        # ...
      }
    }
  }

All [pscustomobject] instances (implicitly) output from inside the foreach loop (whether directly or from the nested one) are automatically collected in variable $CalendarDelegateList.

Note:

  • With two or more output objects from the loop, the $CalendarDelegateList variable receives a regular PowerShell array (of type [object[]]).

  • The [array] type constraint (short for: [object[]]) additionally ensures that the result is an array even if the loop outputs only one object.

  • Related