我的代码得到了所有挂起的用户,他们最后一次交互的时间,以及这个人拥有的许可证。目前我认为我可以做得更好,我只是意识到我需要找到拥有最古老的交互时间的用户,然后用最古老的用户做事情。
$GSuspend = gam report users parameters accounts:is_disabled,gmail:last_interaction_time fulldatarequired accounts | ConvertFrom-Csv | Where-Object { $_.'accounts:is_disabled' -eq $true }
$GLicenses = gam print users licenses | ConvertFrom-Csv | Where-Object { $_.Licenses -contains '1010020020' -or $_.Licenses -contains '1010340001' }
#archive = 1010340001 , 1010020020 = main
$Result = $GSuspend | ForEach-Object {
If ($GLicenses.primaryEmail -contains $_.email ) {
foreach ($License in $GLicenses) {
If ($License.primaryEmail -eq $_.email) {
If ($License.licenses -contains '1010020020' ) {
$Type = 'Main'
}
ElseIF ($License.licenses -contains '1010340001' ) {
$Type = 'Archive'
}
Else {
$Type = $License.licenses
}
}
}
If ( $null -ne $_."gmail:last_interaction_time" ) {
$GMailLastUsed = Get-date($_."gmail:last_interaction_time") -Format("MM-dd-yy")
}
Else { $GMailLastUsed = $null }
[PSCustomObject]@{
Email = $_.email
Type = $Type
LastUsed = $GMailLastUsed
}
}
}
示例输出
<Email> Archive 06-24-20
<Email> Main 06-24-20
<Email> Main 07-30-21
<Email> Archive 06-24-20
<Email> Archive 05-06-19
我需要遍历$Result
吗?如果是这样,我甚至不确定如何找到最古老的日期?我觉得一定有更好的办法?
您可以在整个循环中跟踪分配的最老的主许可证:
# create a simple object to keep track of the oldest observed user with a main license
$oldest = [pscustomobject]@{
When = $null
User = $null
}
$Result = $GSuspend | ForEach-Object {
If ($GLicenses.primaryEmail -contains $_.email ) {
foreach ($License in $GLicenses) {
If ($License.primaryEmail -eq $_.email) {
If ($License.licenses -contains '1010020020' ) {
$Type = 'Main'
# we found a user with a main license - let's compare their date to the previous oldest user
$lastUse = (Get-Date $_.'gmail:last_interaction_time')
if($null -eq $oldest.User -or $oldest.When -gt $lastUse){
# update $oldest
$oldest.When = $lastUse
$oldest.User = $_
}
}
}
}
# ...
}
}
一旦到达循环的末尾,$oldest.User
将包含找到的符合许可标准的最老的用户。
或者,在构造输出对象时切换到可排序的datetime格式:
$GMailLastUsed = Get-date $_."gmail:last_interaction_time" -Format "yyyy-MM-dd"
现在你的日期字符串的组成部分按最重要到最不重要的顺序排列,你可以使用字符串排序来找到最古老的:
$oldest = $Result |Where-Object Type -eq 'Main' |Sort-Object LastUsed |Select -First 1
对于任何来到这个话题的人。
我想指出我所接受的答案并非100%正确。后来我了解到sort-object
的默认顺序是升序。https://learn.microsoft.com/en - us/powershell/module/microsoft.powershell.utility/sort object?view=powershell - 7.1
我需要最老的项作为第一个。下面的代码使用-descending
似乎做得更好。
$Oldest = $Results | Where-Object { $_.Type -eq 'Main' } | Sort-Object -property 'LastUsed' -Descending | Select-Object -First 1
此外,在另一个主题中,我问如何处理$null
时寻找最古老的。这里有一个很好的答案。LastUsed有时为空白或$null