examples/hastables.ps1
#Import Useful Modules Import-Module .\PSBlackboard.psm1 -Verbose -force #Get Useful Terms $CurrentTerms = Get-BBTerms -TargetTerm 'AllCurrent' $LMSConnectDataSourceKey = Get-BBDataSources -ExternalID 'LMSConnect' #Other Variables $FileName = '.\examples\EarlyWarning.csv' $FileName = '\\oc-share2\BBFiles\Output\EarlyWarning.csv' [System.Collections.ArrayList]$FeedFileOutput = @() $Counter = 0 #Get the courses foreach($Term in $CurrentTerms){ [System.Collections.ArrayList]$Courses = @() [System.Collections.ArrayList]$CourseMemberships = @() #$CourseMemberships = @() Get-BBCourses -Filter "termId=$($Term.id)" -limit $false | ForEach-Object { $Courses.add($_) | Out-Null} #Get all courses membershps for the semester. Expand user brings back the user information for this call. $Courses | foreach-Object -Begin{ $Counter = 0 } -Process { $Counter += 1 # Write-Debug "Processing Course Enrollments Progress: $($Counter)/$($Courses.count) ($($($Counter)/$($Courses.count))) [$($_.id)] PercentComplete $(($($Counter)/$($Courses.count))*100)" Write-Progress -Activity "Getting Cousre Memberships from Blackboard API" -status "Progress: $($Counter)/$($Courses.count) ($($($Counter)/$($Courses.count))) [$($_.id)]" -PercentComplete (($($Counter)/$($Courses.count))*100) $params = @{ CourseID = $_.id ExpandUser = $true } Write-Debug "Processing memberships for $($_.id)" $Items = $(Get-BBCourseMemberships @params ) $Items | ForEach-Object{ $CourseMemberships.Add($_) | Out-Null } #$CourseMemberships += Get-BBCourseMemberships @params #-Verbose } -End { } } #Owned Enrollments by LMSConnect that are child enrollments, or just single shells. $LMSConnectCourseMemeberships = $CourseMemberships | Where-Object {($_.dataSourceId -eq $LMSConnectDataSourceKey.id)} $CoursesCourseIDHashTable = $Courses | Group-Object -AsHashTable -Property id #Get a distinct list of parent course ID's. Then process the hashtable for only these #Get a distinct list of child shells with no parents. Add these enrollments. If that's fast.. then we can keep going $Counter = 0 #Get An EPN on each memebership record. foreach($CourseMembership in $LMSConnectCourseMemeberships){ $Counter += 1 Write-Progress -Activity "Adding EPN to each membership record" -Status "Progress: $($Counter)/$($LMSConnectCourseMemeberships.count) ($($($Counter)/$($LMSConnectCourseMemeberships.count))) [$($Course.externalId) for $($CourseMembership.user.externalID)]" -PercentComplete (($($Counter)/$($LMSConnectCourseMemeberships.count))*100) if($null -ne $CourseMembership.childCourseId){ #Find the corresponding child shell and get it's epn to put on the enrollment $CorrespondingChild = $CoursesCourseIDHashTable[$CourseMembership.childCourseId] $EPN = $($($CorrespondingChild.courseId).split("_")[0]).split("-")[2] Add-Member -InputObject $CourseMembership -NotePropertyName EPN -NotePropertyValue $EPN -force }else{ $Course = $CoursesCourseIDHashTable[$CourseMembership.courseId] $EPN = $($($Course.courseId).split("_")[0]).split("-")[2] Add-Member -InputObject $CourseMembership -NotePropertyName EPN -NotePropertyValue $EPN -force } } $LMSConnectCourses_UsersHashtable = $LMSConnectCourseMemeberships | Group-object -Property EPN,userId -AsHashTable -AsString $counter = 0 foreach($key in $LMSConnectCourses_UsersHashtable.Keys){ $Counter += 1 Write-Progress -Activity "Determining Last Access Datetime" -Status "Progress: $($Counter)/$($LMSConnectCourses_UsersHashtable.count) ($($($Counter)/$($LMSConnectCourses_UsersHashtable.count))) [$($LMSConnectCourses_UsersHashtable[$key][0].EPN) for $($LMSConnectCourses_UsersHashtable[$key][0].user.contact.email)]" -PercentComplete (($($Counter)/$($LMSConnectCourses_UsersHashtable.count))*100) $LastAccessed = $null $LMSConnectCourses_UsersHashtable[$key] | ForEach-Object{ $CourseLastAccessed = $_.lastAccessed if ($null -ne $CourseLastAccessed){ if($CourseLastAccessed -gt $LastAccessed){ $LastAccessed = $CourseLastAccessed } } } $FeedFileOutput.Add([PSCUstomObject]@{ EPN = $LMSConnectCourses_UsersHashtable[$key][0].EPN 'Student ID #' = $LMSConnectCourses_UsersHashtable[$key][0].user.studentId LName = $LMSConnectCourses_UsersHashtable[$key][0].user.name.family FName = $LMSConnectCourses_UsersHashtable[$key][0].user.name.given Email = $LMSConnectCourses_UsersHashtable[$key][0].user.contact.email studentId = $LMSConnectCourses_UsersHashtable[$key][0].user.externalID lastAccessed = if ($null -eq $LastAccessed){ "" }else{ $LastAccessed } }) | out-null } $FeedFileOutput| Sort-Object -Property 'EPN','Email' | Select-Object -Property EPN,'Student ID #',Lname,FName,Email,@{ Name = 'Last Access Date'; Expression = {$($_.lastAccessed.ToLocalTime())}},@{ Name = 'Days Since Last Accessed'; Expression = { $(New-TimeSpan -start $($_.lastAccessed.ToLocalTime()) -end $(Get-Date)).Days}} | ConvertTo-Csv -NoTypeInformation -Delimiter '|' |ForEach-Object { $_ -replace '"', ""} |Set-Content -path $FileName |