Public/Update-XKCDCache.ps1

Function Update-XKCDCache {
    <#
    .SYNOPSIS
        Updates the local cache of the XKCD API.
 
    .DESCRIPTION
        The Update-XKCDCache cmdlet updates the local cahce of the XKCD comic API with any new data from the server.
        The cahce is stored within the module script directory as XKCD.json.
 
    .PARAMETER CachePath
        Optional: Specify a path for where to create/update the XKCD cache. By default this is within the module path.
 
    .EXAMPLE
        Update-XKCDCache
 
        Updates the local XKCD.json file with full data from the XKCD API.
 
    .LINK
        https://xkcd.com/json.html
    #>

    [cmdletbinding(SupportsShouldProcess)]
    Param(
        [string]
        $CachePath = (Join-Path $PSScriptRoot 'XKCD.json')
    )

    $Max = (Invoke-RestMethod http://xkcd.com/info.0.json).num

    if (-not (Test-Path $CachePath)) {
        Write-Warning 'Local cache file not found. Recreating a local cache of the comic data. This might take a few minutes..'

        $AllComics = ForEach ($Comic in 1..$Max) {
            Write-Progress -Activity "Creating cache" -Status "Reading comic #$Comic" -PercentComplete (($Comic / $Max) * 100)
            Invoke-RestMethod "http://xkcd.com/$Comic/info.0.json"
        }
    
        $AllComics | ConvertTo-Json | Out-File $CachePath
    }
    Else {
        $AllComics = Get-Content $CachePath | ConvertFrom-Json
    }

    $LastComic = ($AllComics  | Sort-Object num -Descending | Select-Object -First 1).num

    If ($Max -gt $LastComic) {
        Write-Verbose 'Refreshing cache with latest comics'

        ForEach ($Comic in $LastComic..$Max) {
            Write-Progress -Activity "Refreshing cache" -Status "Reading comic #$Comic" -PercentComplete (($Comic / $Max) * 100)
            $AllComics += (Invoke-RestMethod "http://xkcd.com/$Comic/info.0.json")
        }

        $AllComics | ConvertTo-Json | Out-File $CachePath -Force
    }
}