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( # By default the cache is created/updated within the module path, unless a default has been saved with # Set-XKCDDefault -CachePath. [string] $CachePath = (Get-XKCDDefaultValue -Name 'CachePath' -Value (Join-Path $PSScriptRoot 'XKCD.json')) ) $Max = (Invoke-RestMethod https://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 "https://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 "https://xkcd.com/$Comic/info.0.json") } $AllComics | ConvertTo-Json | Out-File $CachePath -Force } } |