Public/Restore-Office365ModuleState.ps1

function Restore-Office365ModuleState {
    <#
    .SYNOPSIS
    Installs supported Office 365 modules from a saved module state.

    .DESCRIPTION
    Reads the 'ModuleState' array from the preferences file and installs each module.
    By default the exact version stored in the state is installed.
    Use -Recent to install the latest available version instead.

    The module state is created by Save-Office365ModuleState.

    .PARAMETER Recent
    When specified, installs the most recent available version of each module rather
    than the pinned version stored in the state.

    .EXAMPLE
    Restore-Office365ModuleState
    Reinstalls each module at the exact version recorded by Save-Office365ModuleState.

    .EXAMPLE
    Restore-Office365ModuleState -Recent
    Installs the latest available version of each saved module.
    #>

    [CmdletBinding()]
    param(
        [switch]$Recent
    )

    $local:configPath = Join-Path -Path ([System.Environment]::GetFolderPath(
        [System.Environment+SpecialFolder]::ApplicationData)) -ChildPath 'Office365Services\config.json'

    if (-not (Test-Path -Path $local:configPath -PathType Leaf)) {
        Write-Warning ('No preferences file found at ''{0}''. Run Save-Office365ModuleState first.' -f $local:configPath)
        return
    }

    try {
        $local:json = Get-Content -Path $local:configPath -Raw -ErrorAction Stop | ConvertFrom-Json -ErrorAction Stop
    }
    catch {
        Write-Error ('Failed to read preferences file: {0}' -f $_)
        return
    }

    $local:ModuleState = $local:json.ModuleState
    if (-not $local:ModuleState) {
        Write-Warning ('No module state found in the preferences file. Run Save-Office365ModuleState first.')
        return
    }

    $local:Scope   = $script:myOffice365Services['Scope']
    $local:UsePSRG = $script:myOffice365Services['PSResourceGet']

    foreach ($local:Entry in $local:ModuleState) {
        $local:ModuleName    = $local:Entry.Module
        $local:PinnedVersion = $local:Entry.Version

        if ($Recent) {
            Write-Host ('Installing {0} (latest)...' -f $local:ModuleName) -NoNewline
            try {
                Install-myModule -Name $local:ModuleName
                Write-Host (' Done') -ForegroundColor Green
            }
            catch {
                Write-Host (' Failed') -ForegroundColor Red
                Write-Warning ('Could not install {0}: {1}' -f $local:ModuleName, $_.Exception.Message)
            }
        }
        else {
            Write-Host ('Installing {0} v{1}...' -f $local:ModuleName, $local:PinnedVersion) -NoNewline
            try {
                if ($local:UsePSRG) {
                    Install-PSResource -Name $local:ModuleName -Version $local:PinnedVersion -Scope $local:Scope -TrustRepository -ErrorAction Stop
                }
                else {
                    Install-Module -Name $local:ModuleName -RequiredVersion $local:PinnedVersion -Scope $local:Scope -Force -AllowClobber -ErrorAction Stop
                }
                Write-Host (' Done') -ForegroundColor Green
            }
            catch {
                Write-Host (' Failed') -ForegroundColor Red
                Write-Warning ('Could not install {0} v{1}: {2}' -f $local:ModuleName, $local:PinnedVersion, $_.Exception.Message)
            }
        }
    }
}