PowerShell生成谷歌日历委托报表不使用+=包含无委托用户的方法
实现方案
核心思路是直接捕获整个外层循环的输出到结果变量,PowerShell 会自动把所有输出的 PSCustomObject 整理为数组,完全不需要+=运算符,同时性能比+=拼接数组更优(+=每次都会重新生成新数组,用户量大时性能损耗明显)。
调整后的完整代码如下:
<#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循环的所有输出赋值给结果变量 $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) { [PSCustomObject]@{ Owner = $UserEmail Type = 'Calendar' Delegate = $line.'scope.value' Role = $line.role } } } Else { # 无委托的情况,输出标记为None的对象,同样会被捕获 [PSCustomObject]@{ Owner = $UserEmail Type = 'Calendar' Delegate = 'None' Role = 'None' } } } $CalendarDelegateList = $CalendarDelegateList | Sort-Object -Property Owner $filename = MRNAP -ReportName WhoIsCalendarDelegated -Move # 修复原代码笔误:$CalendarDelegateLis 缺少末尾的t $CalendarDelegateList | Export-Csv $filename -NoTypeInformation
说明
- 循环内不需要做任何赋值操作,只要把要加入结果集的对象直接输出即可,PowerShell 会自动把所有输出的对象收集到变量中
- 如果用户有多个日历委托,会自动生成多条对应记录,没有委托的用户也会生成一条标记为
None的记录,完全符合报表统计需求 - 这种方式因为提前覆盖了无委托的输出场景,结果变量不会出现
$null的情况,后续排序、导出操作都可以正常执行
内容的提问来源于stack exchange,提问作者dcaz
相关产品推荐
相关产品推荐

