Public/Invoke-EvergreenLibraryUpdate.ps1
function Invoke-EvergreenLibraryUpdate { <# .EXTERNALHELP Evergreen-help.xml #> [CmdletBinding(SupportsShouldProcess = $True)] param ( [Parameter( Mandatory = $True, Position = 0, ValueFromPipelineByPropertyName, HelpMessage = "Specify the path to the library.", ParameterSetName = "Path")] [ValidateNotNull()] [System.IO.FileInfo] $Path, [Parameter(Mandatory = $False, Position = 1)] [System.String] $Proxy, [Parameter(Mandatory = $False, Position = 2)] [System.Management.Automation.PSCredential] $ProxyCredential = [System.Management.Automation.PSCredential]::Empty ) begin { $params = @{} if ($PSBoundParameters.ContainsKey("Proxy")) { $params.Proxy = $Proxy } if ($PSBoundParameters.ContainsKey("ProxyCredential")) { $params.ProxyCredential = $ProxyCredential } } process { if (Test-Path -Path $Path -PathType "Container") { $LibraryFile = $(Join-Path -Path $Path -ChildPath "EvergreenLibrary.json") if (Test-Path -Path $LibraryFile) { Write-Verbose -Message "Library exists: $LibraryFile." $Library = Get-Content -Path $LibraryFile -ErrorAction "Stop" | ConvertFrom-Json -ErrorAction "Stop" # Get current list of install media files present in library $LibContentBefore = Get-ChildItem -Path $Path -File -Recurse -Exclude "*.json" | ` Select-Object -Property "FullName" | Sort-Object -Property "FullName" # Return the application details foreach ($Application in $Library.Applications) { $AppPath = $(Join-Path -Path $Path -ChildPath $Application.Name) Write-Verbose -Message "$($MyInvocation.MyCommand): Application path: $AppPath." Write-Verbose -Message "$($MyInvocation.MyCommand): Query Evergreen for: $($Application.Name)." try { Write-Verbose -Message "$($MyInvocation.MyCommand): Filter: $($Application.Filter)." $WhereBlock = [ScriptBlock]::Create($Application.Filter) } catch { throw $_ } # Gather the application version information from Get-EvergreenApp [System.Array]$App = @() $App = Get-EvergreenApp -Name $Application.EvergreenApp @params | Where-Object $WhereBlock # If something returned, add to the library if ($null -ne $App) { Write-Verbose -Message "$($MyInvocation.MyCommand): Download count for $($Application.EvergreenApp): $($App.Count)." # Save the installers to the library if ($PSCmdlet.ShouldProcess("Downloading $($App.Count) application installers.", "Save-EvergreenApp")) { $Saved = $App | Save-EvergreenApp -Path $AppPath @params } # Add the saved installer path to the application version information if ($Saved.Count -gt 1) { for ($i = 0; $i -lt $App.Count; $i++) { $Item = $Saved | Where-Object { $_.FullName -match $App[$i].Version -and ((Split-Path $_.FullName -Leaf) -eq (Split-Path $App[$i].URI -Leaf)) } Write-Verbose -Message "$($MyInvocation.MyCommand): Add path to object: $($Item.FullName)" $App[$i] | Add-Member -MemberType "NoteProperty" -Name "Path" -Value $Item.FullName } } else { Write-Verbose -Message "$($MyInvocation.MyCommand): Add path to object: $($Saved.FullName)" $App | Add-Member -MemberType "NoteProperty" -Name "Path" -Value $Saved.FullName } # Write the application version information to the library Export-EvergreenApp -InputObject $App -Path $(Join-Path -Path $AppPath -ChildPath "$($Application.Name).json") | Out-Null } } # Get new list of install media files present in library following update $LibContentAfter = Get-ChildItem -Path $Path -File -Recurse -Exclude "*.json" | Select-Object FullName | Sort-Object FullName # Output details of library updates if ($null -eq $LibContentAfter) { Write-Warning -Message "$($MyInvocation.MyCommand): No media found in Evergreen Library" } elseif ($null -ne $LibContentBefore) { (Compare-Object $LibContentBefore $LibContentAfter -Property FullName -IncludeEqual | ForEach-Object { [PSCustomObject]@{ Installer = $_.Fullname Status = $_.SideIndicator -replace "=>", "NEW" -replace "==", "UNCHANGED" -replace "<=", "DELETED" } }) } else { ($LibContentAfter | ForEach-Object { [PSCustomObject]@{ Installer = $_.FullName Status = "NEW" } }) } } else { $Msg = "$Path is not an Evergreen Library. Cannot find EvergreenLibrary.json. Create a library with New-EvergreenLibrary." throw [System.IO.FileNotFoundException]::New($Msg) } } else { $Msg = "Cannot use path $Path because it does not exist or is not a directory." throw [System.IO.DirectoryNotFoundException]::New($Msg) } } } |