Sample Commands and Scripts
    • 18 Mar 2024
    • 7 Minutes to read
    • Contributors
    • Dark
      Light
    • PDF

    Sample Commands and Scripts

    • Dark
      Light
    • PDF

    Article Summary

    MS Teams Datacenter Meeting Connection Summary

    Outputs a list of MS Teams datacenter locations where users have been connecting to for meetings over the past week.

    Get-NectarSessions -TimePeriod LAST_WEEK -Modalities AUDIO -Platforms TEAMS -SessionTypes CONFERENCE_SESSION | 
        Select-Object CalleeExtCity, CalleeExtCountry | 
        Group-Object calleeExtCity, calleeExtCountry | 
        Select-Object Count, Name | Sort-Object Count -Descending
    

    Conference List with Participant Names

    Outputs a list of conferences from the last week with a list of participant names to a CSV file.

    Get-NectarSessions -TimePeriod LAST_WEEK -SessionTypes CONFERENCE | 
        Select-Object CallerPlatform, StartDate, confOrganizerorSpace,
        @{Name='Duration(min)';Expression={[int]($_.Duration/60)}}, Participants, Modality, 
        @{Name='Participant Names';Expression={(Get-NectarConferenceParticipants -ConferenceID $_.id -Platform $_.CallerPlatform[0]).UserDisplayName | %{$ParticipantNames += ($(if($ParticipantNames){"; "}) + $_)}; $ParticipantNames}} | 
        Export-Csv ConfList.csv -NoTypeInformation
    

    Call Volume Statistics by Location

    Outputs a list of locations and the total volume and total/min/max/average time spent on calls for a given timeframe. Outputs data to CSV files.

    $RawData = Get-NectarSessions -TimePeriod LAST_MONTH -SessionTypes PEER2PEER,PEER2PEER_MULTIMEDIA,PSTN | Select-Object CallerLocation, CalleeLocation, Duration
    $RawData | Show-GroupAndStats -GroupBy callerLocation -SumBy duration -ShowSumByAsTimeFormat | Export-Csv CallerStatsByLocation.csv -NoTypeInformation
    $RawData | Show-GroupAndStats -GroupBy calleeLocation -SumBy duration -ShowSumByAsTimeFormat | Export-Csv CalleeStatsByLocation.csv -NoTypeInformation
    

    Call Volume Statistics by Location Pairs

    Outputs a list of location pairs and the total volume and total/min/max/average time spent on calls between location pairs for a given timeframe. Outputs data to CSV file.

    $RawData = Get-NectarSession -TimePeriod LAST_MONTH -SessionTypes PEER2PEER,PEER2PEER_MULTIMEDIA,PSTN | Select-Object CallerLocation, CalleeLocation, Duration
    Show-GroupAndStats -InputObject $RawData -GroupBy callerLocation,calleeLocation -SumBy duration -ShowSumByAsTimeFormat | Format-Table

    Daily Call Count

    Outputs a daily count of P2P, PSTN or CONFERENCE sessions for the previous week.

    For ($x = 0; $x -gt -7; $x--) { 
        $DateFrom = (([DateTime](Get-Date).AddDays($x-1).ToString("yyyy-MM-dd")).ToUniversalTime()).ToString("yyyy-MM-dd hh:mm:ss"); 
        $DateTo = ((([DateTime](Get-Date).AddDays($x).ToString("yyyy-MM-dd")).ToUniversalTime()).AddSeconds(-1)).ToString("yyyy-MM-dd hh:mm:ss");
        Get-NectarModalityQualitySummary -Modality AUDIO -SessionTypes PSTN -TimePeriod CUSTOM -TimePeriodFrom $DateFrom -TimePeriodTo $DateTo | Select-Object @{Name='Date';Expression={(Get-Date).AddDays($x-1).ToString("yyyy-MM-dd")}}, @{Name='CallCount';Expression={[math]::Round($_.NUMBER_OF_STREAMS)/2}}
    }
    

    Call Metric Averages by Location

    Outputs a summary of standard call quality metric averages (jitter, packet loss, roundtrip time) for the previous week grouped by location.

    $LocationList = Get-NectarLocation | Select-Object NetworkName -Unique
    $LocationQualitySummary = @()
    
    ForEach ($Location in $LocationList) {
    	$LocData = Get-NectarModalityQualitySummary -TimePeriod LAST_WEEK -Modality AUDIO -Locations $Location.networkName -SessionTypes 'PEER2PEER' | Select-Object LocationName, * -ExcludeProperty *_TREND
    	$LocData.LocationName = $Location.networkName
    	$LocationQualitySummary += $LocData
    }
    
    Return $LocationQualitySummary | Where {$_.NUMBER_OF_STREAMS -gt 0} | FT
    
    # FOR AVAYA/CISCO quality data only
    
    $LocationList = Get-NectarLocation | Select-Object NetworkName -Unique
    $LocationQualitySummary = @()
    
    ForEach ($Location in $LocationList) {
    	$LocData = Get-NectarQualitySummary -TimePeriod LAST_DAY -Locations $Location.networkName | Select-Object LocationName, * -ExcludeProperty *_TREND, NUMBER_OF_STREAMS
    	$LocData.LocationName = $Location.networkName
    	$LocationQualitySummary += $LocData
    }
    
    Return $LocationQualitySummary | Where {$_.TOTAL_GOOD -ne $NULL} | FT
    

    Call Metric Averages by Location and User

    Outputs a summary of standard call quality metric averages (jitter, packet loss, roundtrip time) for the previous day grouped by location and user. Places results in a CSV file called UserQualitySummary.csv as well as screen.

    # Set the time period to pull call data. Select one of 'LAST_HOUR', 'LAST_DAY', 'LAST_WEEK', or 'LAST_MONTH'
    $TimePeriod = 'LAST_DAY'
    
    # Pull the list of locations
    $LocationList = Get-NectarLocation | Select-Object NetworkName -Unique
    
    # Remove any existing UserQualitySummary.csv file
    Remove-Item UserQualitySummary.csv -Force
    
    ForEach ($Location in $LocationList) {
        # Get a list of users who made/received calls over the selected time period
    	Write-Host "Working on $($Location.NetworkName)"
    	$FromUserList = Get-NectarSessions -CallerLocations $Location.NetworkName -TimePeriod $TimePeriod -Modalities AUDIO -SessionTypes 'PEER2PEER' | Select-Object from | Where {$_.from -ne 'unknown'}
    	$ToUserList = Get-NectarSessions -CalleeLocations $Location.NetworkName -TimePeriod $TimePeriod -Modalities AUDIO -SessionTypes 'PEER2PEER' | Select-Object to | Where {$_.to -ne 'unknown'}
    
    	$UserList = ($FromUserList.From + $ToUserList.To) | Sort-Object -Unique
    	Write-Host "$($Location.NetworkName) has $($UserList.Count) users"
        
    	$UserQualitySummary = @()
        
    	ForEach ($User in $UserList) {
    		Write-Host "Working on $User"
    		$UserData = Get-NectarModalityQualitySummary -TimePeriod $TimePeriod -Users $User -Modality AUDIO -SessionTypes PEER2PEER -ErrorAction SilentlyContinue | Select-Object User, Location, * -ExcludeProperty *_TREND
    		If ($UserData) {
    			$UserData.User = $User
    			$UserData.Location = $Location.NetworkName
    			$UserQualitySummary += $UserData
    		}
    	}
    	$UserQualitySummary | Where {$_.NUMBER_OF_STREAMS -gt 0} | Export-Csv UserQualitySummary.csv -NoTypeInformation -Append
    }
    
    Return $UserQualitySummary | Where {$_.NUMBER_OF_STREAMS -gt 0} | FT
    
    # FOR AVAYA/CISCO quality data only
    # Set the time period to pull call data. Select one of 'LAST_HOUR', 'LAST_DAY', 'LAST_WEEK', or 'LAST_MONTH'
    $TimePeriod = 'LAST_DAY'
    
    # Pull the list of locations
    $LocationList = Get-NectarLocation | Select-Object NetworkName -Unique
    
    # Remove any existing UserQualitySummary.csv file
    Remove-Item UserQualitySummary.csv -Force
    
    ForEach ($Location in $LocationList) {
        # Get a list of users who made/received calls over the selected time period
    	Write-Host "Working on $($Location.NetworkName)"
    	$FromUserList = Get-NectarSessions -CallerLocations $Location.NetworkName -TimePeriod $TimePeriod -ShowQualityDetails | Select-Object from | Where {$_.from -ne 'unknown'}
    	$ToUserList = Get-NectarSessions -CalleeLocations $Location.NetworkName -TimePeriod $TimePeriod -ShowQualityDetails | Select-Object to | Where {$_.to -ne 'unknown'}
    
    	$UserList = ($FromUserList.From + $ToUserList.To) | Sort-Object -Unique
    	Write-Host "$($Location.NetworkName) has $($UserList.Count) users"
        
    	$UserQualitySummary = @()
        
    	ForEach ($User in $UserList) {
    		Write-Host "Working on $User"
    		$UserData = Get-NectarQualitySummary -TimePeriod $TimePeriod -Users $User -ErrorAction SilentlyContinue | Select-Object User, Location, * -ExcludeProperty *_TREND
    		If ($UserData) {
    			$UserData.User = $User
    			$UserData.Location = $Location.NetworkName
    			$UserQualitySummary += $UserData
    		}
    	}
    	$UserQualitySummary | Where {$_.NUMBER_OF_STREAMS -gt 0} | Export-Csv UserQualitySummary.csv -NoTypeInformation -Append
    }
    
    Return $UserQualitySummary | Where {$_.NUMBER_OF_STREAMS -gt 0} | FT
    

    Poor Call List with Reasons

    Creates a CSV file of all poor audio calls for the previous day along with the metrics that made each call poor. Works for any platform, but this example focuses on Teams. This may take a long time to run, depending on the volume of poor calls.

    $SessionList = @()
    
    $SessionParams = @{
        TimePeriod = 'LAST_DAY'
        Platforms = 'TEAMS'
        Modalities = 'AUDIO'
        SessionQualities = 'POOR_0_25'
        SessionTypes = 'CONFERENCE_SESSION','PEER2PEER','PSTN'
    }
    
    $BadSessions = Get-NectarSessions @SessionParams | Select-Object SessionID, startDate, duration, from, to, CallerLocation, CalleeLocation, callerDeviceVersion, CalleeDeviceVersion, CallerPlatform, CalleePlatform, Servers, CallerBadReason, CalleeBadReason
    
    ForEach ($Session in $BadSessions) {
    	$BadDetails = Get-NectarSessionAlerts -SessionID $Session.SessionID -Platform $Session.CallerPlatform |  Where {$_.AlertLevel -eq 'CRITICAL'}
    	$BadCallerStr=$NULL; $BadDetails | Where {$_.User -eq 'Caller'} | %{$BadCallerStr += ($(If($BadCallerStr){', '}) + ($_.Parameter -Replace('^\w+(Average|Caller)','')) + ':' + $_.Value)}
    	$BadCalleeStr=$NULL; $BadDetails | Where {$_.User -eq 'Callee'} | %{$BadCalleeStr += ($(If($BadCalleeStr){', '}) + ($_.Parameter -Replace('^\w+(Average|Callee)','')) + ':' + $_.Value)}
    	
    	$Session.CallerBadReason = $BadCallerStr
    	$Session.CalleeBadReason = $BadCalleeStr
    	
    	$SessionList += $Session
    }
    
    $SessionList | Export-Csv BadCallList.csv -NoTypeInformation
    

    User Feedback Detail Report

    Creates a CSV file of the previous week's user feedback ratings/comments for MS Teams. Excludes feedback from 'External User'.

    Get-NectarSessions -TimePeriod LAST_WEEK -Modalities AUDIO -FeedbackRating EXCELLENT,GOOD,FAIR,POOR,BAD -SessionTypes CONFERENCE_SESSION,PEER2PEER,PEER2PEER_MULTIMEDIA,PSTN -Platforms TEAMS | 
       Where-Object {-not (($_.From -eq 'External User' -And $_.callerRating -ne $NULL) -or ($_.To -eq 'External User' -And $_.calleeRating -ne $NULL))} -PipelineVariable SummaryInfo | 
       Get-NectarSessionDetails | 
           Select-Object @{n='StartTime';e={$SummaryInfo.StartDate}},
    		@{n='Duration';e={[math]::Round($SummaryInfo.Duration/60,2)}},
    		Caller,Callee,*CallerFeedback*,*CalleeFeedback* | 
    		Export-Csv WeeklyTeamsUserFeedback.csv -NoTypeInformation
    

    User Feedback Summary Report

    Creates a CSV file that will create a pivot table summarizing the user feedback ratings for a given timeframe grouped by day and rating.

    # Pull down the full list of sessions with feedback
    $Params = @{
        TimePeriod = 'LAST_WEEK'
        Platforms = 'TEAMS'
        Modalities = 'AUDIO'
    	FeedbackRating = 'EXCELLENT','GOOD','FAIR','POOR','BAD'
        SessionTypes = 'CONFERENCE_SESSION','PEER2PEER','PEER2PEER_MULTIMEDIA','PSTN'
    }
    
    $FullFeedbackList = Get-NectarSessions @Params | 
    	Where-Object {-not (($_.From -eq 'External User' -And $_.callerRating -ne $NULL) -or ($_.To -eq 'External User' -And $_.calleeRating -ne $NULL))} | 
    	Select-Object StartDate,CallerRating,CalleeRating
    
    # Create a flat list of ratings and date/times. 
    $FeedbackList = New-Object -TypeName "System.Collections.ArrayList"
    
    ForEach ($Entry in $FullFeedbackList) {
    	If ($Entry.CallerRating -ne $NULL) { $FeedbackList.Add([PSCustomObject]@{StartDate=([datetime]$Entry.StartDate).ToShortDateString();Rating=$Entry.CallerRating}) | Out-Null }
    	If ($Entry.CalleeRating -ne $NULL) { $FeedbackList.Add([PSCustomObject]@{StartDate=([datetime]$Entry.StartDate).ToShortDateString();Rating=$Entry.CalleeRating}) | Out-Null }
    }
    
    # Group the data for the pivot table
    $FeedbackGroupByDate = $FeedbackList | Group-Object StartDate
    $FeedbackGroupByRating = $FeedbackList | Group-Object Rating
    
    # Create the main pivot table. Each date is a row, and each feedback rating value is a column
    $PivotData = ForEach ($Date in $FeedbackGroupByDate) {
    	$Props = @(
    		@{ Name = 'Date' ; Expression = { $Date.Group | Select-Object -ExpandProperty StartDate -Unique }}
            ForEach ($Rating in 'EXCELLENT','GOOD','FAIR','POOR','BAD') {
                @{ Name = $Rating ; Expression = { ($Date.Group | Where-Object Rating -eq $Rating | Select-Object -ExpandProperty Rating | Measure-Object).Count }.GetNewClosure()}
    		}
    		@{ Name = 'Total' ; Expression = { ($Date.Group | Measure-Object).Count }}
    	)
        $Date | Select-Object $props
    }
    
    # Add a total row at the bottom
    $Props = @(
    	@{ Name = 'Date' ; Expression = {'TOTAL'} }
    	ForEach ($Rating in 'EXCELLENT','GOOD','FAIR','POOR','BAD') {
    		@{ Name = $Rating ; Expression = { ($FeedbackGroupByRating | Where-Object Name -eq $Rating).Count }.GetNewClosure()}
    	}
    	@{ Name = 'Total' ; Expression =  { ($FeedbackGroupByRating | Measure-Object Count -Sum).Sum} }
    )
    
    $PivotData += $FeedbackGroupByRating | Select-object $Props -Unique
    
    # Export to CSV
    $PivotData | Export-Csv FeedbackRatingSummary.csv -NoTypeInformation
    

    Create Analytics Report by Corporate Location

    Creates an Analytics report that shows a chart with last week’s call volume and quality for each location. Schedules the report to run every week and email it to multiple users.

    $ReportName = 'Weekly Volume and Quality Report - By Corp Location'
    $ReportDesc = 'Shows last week''s session volume and quality for all corporate locations'
    
    $LocationList = Get-NectarLocation | Select-Object networkName, siteName -Unique
    $SiteList = $LocationList | Select-Object SiteName -Unique | Where-Object {$_.SiteName -ne $NULL} | Sort-Object siteName
    Remove-Variable WidgetList -Scope Global -ErrorAction SilentlyContinue
    
    $WidgetParams = @{
            WidgetDescription       = "Session Summary for $($Site.siteName)" 
            WidgetGroupVarName      = 'WidgetList'
            TimePeriod              = 'LAST_WEEK'
            SessionTypes            = 'PSTN','PEER2PEER','PEER2PEER_MULTIMEDIA'
    }
    
    ForEach ($Site in $SiteList) {
            $LocationsInSite = $LocationList | Where-Object {$_.siteName -eq $Site.SiteName}
    
            New-NectarReportWidget -WidgetType 'Call Details, Sessions' -Locations $LocationsInSite.networkName @WidgetParams
            New-NectarReportWidget -WidgetType 'Call Details, Quality Audio' -Locations $LocationsInSite.networkName @WidgetParams
    }
    
    $ReportParams = @{
            Name                    = $ReportName
            Description             = $ReportDesc
            WidgetList              = $WidgetList
            Type                    = 'Tenant'
            ScheduleMode            = 'WEEKLY'
            SchedWeekday            = 'MONDAY'
            SchedStartDate          = ((Get-Date).AddDays(7-((Get-Date).DayOfWeek.value__))).AddDays(1).ToString('yyyy-MM-dd')
            SchedStartTime          = '09:00'
            SchedNotifyMethod       = 'EMAIL'
            SchedEmailSubject       = 'Weekly location report'
            SchedEmail              = 'tferguson@contoso.com', 'jblow@contoso.com'
    }
    
    New-NectarReport @ReportParams
    Remove-Variable WidgetList -Scope Global -ErrorAction SilentlyContinue


    Was this article helpful?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.