Private/Migration/Invoke-SetMailboxMoveLicense.ps1

function Invoke-SetMailboxMoveLicense {
    <#
    .SYNOPSIS
    Sets Office 365 licenses during a migration project
    Either CSV or Excel file from SharePoint can be used
 
    .DESCRIPTION
    Sets Office 365 licenses during a migration project
    Either CSV or Excel file from SharePoint can be used
 
    .PARAMETER SharePointURL
    Sharepoint url ex. https://fabrikam.sharepoint.com/sites/Contoso
 
    .PARAMETER ExcelFile
    Excel file found in "Shared Documents" of SharePoint site specified in SharePointURL
    ex. "Batches.xlsx"
    Minimum headers required are: BatchName, UserPrincipalName
 
    .PARAMETER MailboxCSV
    Path to csv of mailboxes. Minimum headers required are: BatchName, UserPrincipalName
 
    .EXAMPLE
    Set-MailboxMoveLicense -MailboxCSV c:\scripts\batches.csv
 
    .EXAMPLE
    Set-MailboxMoveLicense -SharePointURL 'https://fabrikam.sharepoint.com/sites/Contoso' -ExcelFile 'Batches.xlsx'
 
    .NOTES
    General notes
    #>


    [CmdletBinding(DefaultParameterSetName = 'PlaceHolder')]
    param (
        [Parameter(Mandatory, ParameterSetName = 'SharePoint')]
        [ValidateNotNullOrEmpty()]
        [string]
        $SharePointURL,

        [Parameter(Mandatory, ParameterSetName = 'SharePoint')]
        [ValidateNotNullOrEmpty()]
        [string]
        $ExcelFile,

        [Parameter(Mandatory, ParameterSetName = 'CSV')]
        [ValidateNotNullOrEmpty()]
        [string]
        $MailboxCSV,

        [Parameter()]
        [switch]
        $NoBatch,

        [Parameter()]
        [switch]
        $UseTargetUserPrincipalNameColumn
    )
    end {
        switch ($PSCmdlet.ParameterSetName) {
            'SharePoint' {
                $SharePointSplat = @{
                    SharePointURL = $SharePointURL
                    ExcelFile     = $ExcelFile
                    NoBatch       = $true
                }
                $UserChoice = Import-SharePointExcelDecision @SharePointSplat
            }
            'CSV' {
                $CSVSplat = @{
                    MailboxCSV = $MailboxCSV
                    NoBatch    = $true
                }
                $UserChoice = Import-MailboxCsvDecision @CSVSplat
            }
            Default {
                $WhichUsers = @{
                    OutputMode = 'Multiple'
                    Title      = 'Change licenses or options by selecting users. Then click OK and you will be presented options to choose from'
                }
                $AllAzureADUsers = Get-AzureADUser -All:$true
                $DefaultSplat = @{
                    UserChoice           = $AllAzureADUsers
                    All                  = $true
                    IncludeRecipientType = $true
                }
                $UserChoice = Invoke-GetMailboxMoveLicenseUserSku @DefaultSplat | Out-GridView @WhichUsers
            }
        }
        if ($UserChoice -ne 'Quit' ) {
            $LicenseDecision = Get-LicenseDecision
            $LicenseOptions = @{ }
            foreach ($License in $LicenseDecision.Options) {
                $LicenseOptions.Add($License, $true)
            }
            if ($UseTargetUserPrincipalNameColumn) {
                ($UserChoice).TargetUserPrincipalName | Set-CloudLicense @LicenseOptions | Out-GridView -Title "Results of Set Mailbox Move License (using TargetUserPrincipalName column)"
            }
            else {
                ($UserChoice).UserPrincipalName | Set-CloudLicense @LicenseOptions | Out-GridView -Title "Results of Set Mailbox Move License"
            }
        }
    }
}