├── .gitignore ├── .vscode ├── settings.json └── tasks.json ├── LICENSE ├── Nevergreen ├── Apps │ ├── Get-7zip.ps1 │ ├── Get-8x8Work.ps1 │ ├── Get-AdobeAcrobat.ps1 │ ├── Get-AdobeAcrobatReader.ps1 │ ├── Get-AdobeCreativeCloud.ps1 │ ├── Get-AdobeDigitalEditions.ps1 │ ├── Get-AdoptiumTemurin.ps1 │ ├── Get-AdvancedIPScanner.ps1 │ ├── Get-AdvancedInstaller.ps1 │ ├── Get-AdvancedPortScanner.ps1 │ ├── Get-Anaconda.ps1 │ ├── Get-AppleiTunes.ps1 │ ├── Get-AutoIt.ps1 │ ├── Get-CiscoWebex.ps1 │ ├── Get-CiscoWebexAccessAnywhere.ps1 │ ├── Get-CiscoWebexSupportManager.ps1 │ ├── Get-CitrixShareFile.ps1 │ ├── Get-DruideAntidote.ps1 │ ├── Get-Elgato4KCaptureUtility.ps1 │ ├── Get-ElgatoAudioEffects.ps1 │ ├── Get-ElgatoCameraHub.ps1 │ ├── Get-ElgatoControlCenter.ps1 │ ├── Get-ElgatoGameCapture.ps1 │ ├── Get-ElgatoStreamDeck.ps1 │ ├── Get-ElgatoVideoCapture.ps1 │ ├── Get-FileOpenPlugin.ps1 │ ├── Get-FujifilmPixelShiftCombiner.ps1 │ ├── Get-FujifilmRawFileconverterEx.ps1 │ ├── Get-FujifilmXAcquire.ps1 │ ├── Get-FujifilmXRawStudio.ps1 │ ├── Get-FujifilmXWebcam.ps1 │ ├── Get-GoogleDrive.ps1 │ ├── Get-GoogleEarthPro.ps1 │ ├── Get-HarmanAIR.ps1 │ ├── Get-IBMSemeruRuntime.ps1 │ ├── Get-IGELUniversalManagementSuite.ps1 │ ├── Get-IrfanView.ps1 │ ├── Get-JabraDirect.ps1 │ ├── Get-KLiteCodecPack.ps1 │ ├── Get-KomodoLabsNEWTPro.ps1 │ ├── Get-KomodoLabsSlitheris.ps1 │ ├── Get-LSoftActiveBootDisk.ps1 │ ├── Get-LSoftActiveDiskImageLite.ps1 │ ├── Get-LenovoCommercialVantage.ps1 │ ├── Get-LibreOffice.ps1 │ ├── Get-LibreOfficeHelp.ps1 │ ├── Get-LogitechCameraSettings.ps1 │ ├── Get-MicrosoftAzureCLI.ps1 │ ├── Get-MicrosoftOfficeDeploymentTool.ps1 │ ├── Get-MicrosoftOpenJDK.ps1 │ ├── Get-MicrosoftPowerBIDesktop.ps1 │ ├── Get-MicrosoftPowerBIReportBuilder.ps1 │ ├── Get-MicrosoftPurviewInformationProtection.ps1 │ ├── Get-MicrosoftSSMS.ps1 │ ├── Get-MicrosoftSysinternals.ps1 │ ├── Get-MicrosoftWindowsADK.ps1 │ ├── Get-MimecastForOutlook.ps1 │ ├── Get-Miniconda.ps1 │ ├── Get-Nmap.ps1 │ ├── Get-Npcap.ps1 │ ├── Get-OpenVPNCommunity.ps1 │ ├── Get-OpenVPNConnect.ps1 │ ├── Get-Opera.ps1 │ ├── Get-PatchMyPC.ps1 │ ├── Get-PhilippeJouninTftpd64.ps1 │ ├── Get-PingIdentityPingID.ps1 │ ├── Get-Python.ps1 │ ├── Get-QGIS.ps1 │ ├── Get-RIAeID.ps1 │ ├── Get-RadioDetectionCatManager.ps1 │ ├── Get-RedstorBackupProStoragePlatformConsole.ps1 │ ├── Get-TMurgentAppVDefConGroups.ps1 │ ├── Get-TMurgentAppVManage.ps1 │ ├── Get-TMurgentAppVManifestEditor.ps1 │ ├── Get-TMurgentPsfTooling.ps1 │ ├── Get-TMurgentPullApps.ps1 │ ├── Get-TMurgentTMEdit.ps1 │ ├── Get-TMurgentTMEditX.ps1 │ ├── Get-ZebraCardStudio.ps1 │ └── Get-Zoom.ps1 ├── Deprecated │ ├── Get-AdoptOpenJDK.ps1 │ ├── Get-AppVentix.ps1 │ ├── Get-Audacity.ps1 │ ├── Get-FreedomScientificFusion.ps1 │ ├── Get-FreedomScientificJAWS.ps1 │ ├── Get-FreedomScientificZoomText.ps1 │ ├── Get-MasterPackager.ps1 │ ├── Get-MicrosoftAzureInformationProtection.ps1 │ ├── Get-MicrosoftRemoteDesktop.ps1 │ ├── Get-MicrosoftTeams.ps1 │ ├── Get-RStudio.ps1 │ ├── Get-RizonesoftNotepad3.ps1 │ ├── Get-SimonTathamPuTTY.ps1 │ ├── Get-TableauDesktop.ps1 │ ├── Get-TableauReader.ps1 │ └── Get-USBPcap.ps1 ├── Nevergreen.psd1 ├── Nevergreen.psm1 ├── Private │ ├── Get-Link.ps1 │ ├── Get-Version.ps1 │ ├── New-NevergreenApp.ps1 │ ├── Resolve-Uri.ps1 │ └── Set-UriPrefix.ps1 ├── Public │ ├── Find-NevergreenApp.ps1 │ └── Get-NevergreenApp.ps1 └── WIP │ └── Get-PlantronicsHub.ps1 ├── README.md └── Test ├── ImportFunctions.ps1 ├── Nevergreen.Tests.ps1 └── Test.ps1 /.gitignore: -------------------------------------------------------------------------------- 1 | Publish.ps1 2 | notes.txt 3 | notes.md 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | // When enabled, will trim trailing whitespace when you save a file. 3 | "files.trimTrailingWhitespace": true 4 | } 5 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // Available variables which can be used inside of strings. 2 | // ${workspaceRoot}: the root folder of the team 3 | // ${file}: the current opened file 4 | // ${relativeFile}: the current opened file relative to workspaceRoot 5 | // ${fileBasename}: the current opened file's basename 6 | // ${fileDirname}: the current opened file's dirname 7 | // ${fileExtname}: the current opened file's extension 8 | // ${cwd}: the current working directory of the spawned process 9 | { 10 | // See https://go.microsoft.com/fwlink/?LinkId=733558 11 | // for the documentation about the tasks.json format 12 | "version": "2.0.0", 13 | 14 | // Start PowerShell 15 | "windows": { 16 | "command": "${env:windir}/System32/WindowsPowerShell/v1.0/powershell.exe", 17 | //"command": "${env:ProgramFiles}/PowerShell/6.0.0/powershell.exe", 18 | "args": [ "-NoProfile", "-ExecutionPolicy", "Bypass" ] 19 | }, 20 | "linux": { 21 | "command": "/usr/bin/powershell", 22 | "args": [ "-NoProfile" ] 23 | }, 24 | "osx": { 25 | "command": "/usr/local/bin/powershell", 26 | "args": [ "-NoProfile" ] 27 | }, 28 | 29 | // Associate with test task runner 30 | "tasks": [ 31 | { 32 | "taskName": "Test", 33 | "suppressTaskName": true, 34 | "isTestCommand": true, 35 | "args": [ 36 | "Write-Host 'Invoking Pester...'; $ProgressPreference = 'SilentlyContinue'; Invoke-Pester -Script test -PesterOption @{IncludeVSCodeMarker=$true};", 37 | "Invoke-Command { Write-Host 'Completed Test task in task runner.' }" 38 | ], 39 | "problemMatcher": "$pester" 40 | } 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-7zip.ps1: -------------------------------------------------------------------------------- 1 | $Apps = @( 2 | @{Name = '7zip'; Architecture = 'x64'; Type = 'Exe'; Pattern = '7z\d+\-x64\.exe' } 3 | @{Name = '7zip'; Architecture = 'x86'; Type = 'Exe'; Pattern = '7z\d+\.exe' } 4 | @{Name = '7zip'; Architecture = 'ARM64'; Type = 'Exe'; Pattern = '7z\d+\-arm64\.exe' } 5 | @{Name = '7zip'; Architecture = 'x64'; Type = 'Msi'; Pattern = '7z\d+\-x64\.msi' } 6 | @{Name = '7zip'; Architecture = 'x86'; Type = 'Msi'; Pattern = '7z\d+\.msi' } 7 | @{Name = '7zip extra'; Architecture = 'Multi'; Type = '7z'; Pattern = '7z\d+-extra\.7z' } 8 | ) 9 | 10 | $Version = Get-Version -Uri 'https://www.7-zip.org/download.html' -Pattern "7-Zip ((?:\d+\.)+\d+)" 11 | 12 | foreach ($App in $Apps) 13 | { 14 | try 15 | { 16 | $URL = Get-Link -Uri 'https://www.7-zip.org/download.html' -MatchProperty href -Pattern $App.Pattern -PrefixDomain 17 | New-NevergreenApp -Name $App.Name -Version $Version -Uri $URL -Architecture $App.Architecture -Type $App.Type 18 | } 19 | catch 20 | { 21 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-8x8Work.ps1: -------------------------------------------------------------------------------- 1 | $Apps = @( 2 | @{Name = '8x8 Work'; Architecture = 'x64'; Type = 'Exe'; Pattern = 'https://[^<]+\.exe' } 3 | @{Name = '8x8 Work'; Architecture = 'x64'; Type = 'MSI'; Pattern = 'https://[^<]+\.msi' } 4 | ) 5 | 6 | try { 7 | # Download page https://support-portal.8x8.com/viewArticle.html?d=8bff4970-6fbf-4daf-842d-8ae9b533153d&hl=en references content below 8 | $Content = (Invoke-RestMethod -Uri 'https://support-portal.8x8.com/helpcenter/docrenderservice/services/rest/documents/8bff4970-6fbf-4daf-842d-8ae9b533153d?mandatorKey=MANDATOR_USU&contentLanguage=en&additionalData=references=true&additionalData=referencedDocs=true&additionalData=withGraph=true&additionalData=includeReferencesUpToLevel=all' -DisableKeepAlive).Content 9 | 10 | foreach ($App in $Apps) { 11 | $Url = ($Content | Select-String -Pattern $App.Pattern).Matches.Value | Select-Object -First 1 12 | $Version = $Url | Get-Version -ReplaceWithDot 13 | New-NevergreenApp -Name $App.Name -Version $Version -Uri $Url -Architecture $App.Architecture -Type $App.Type 14 | } 15 | 16 | } 17 | catch { 18 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 19 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-AdobeAcrobat.ps1: -------------------------------------------------------------------------------- 1 | $Platforms = @( 2 | @{Architecture = 'x86'; Language = 'Neutral'; Pattern = 'AcrobatDCUpd\d{8,12}\.msp'} 3 | @{Architecture = 'x64'; Language = 'Neutral'; Pattern = 'AcrobatDCx64Upd\d{8,12}\.msp'} 4 | ) 5 | 6 | $Headers = @{'accept' = '*/*'; 'accept-language' = 'en-GB,en;q=0.9,en-US;q=0.8'} 7 | 8 | foreach ($Platform in $Platforms) { 9 | 10 | $ReleaseURL = 'https://www.adobe.com/devnet-docs/acrobatetk/tools/ReleaseNotesDC/index.html' 11 | $SearchCount = 5 12 | 13 | do { 14 | $ReleaseURL = Get-Link -Uri $ReleaseURL -Headers $Headers -MatchProperty outerHTML -Pattern '>Next' -PrefixParent 15 | 16 | $URL = Get-Link -Uri $ReleaseURL -Headers $Headers -MatchProperty href -Pattern $Platform.Pattern 17 | if ($URL) { 18 | $Version = ($URL | Get-Version -Pattern '(\d{8,12}).+msp') -replace '(\d{2})(\d{3})(\d+)','$1.$2.$3' 19 | New-NevergreenApp -Name 'Adobe Acrobat' -Version $Version -Uri $URL -Architecture $Platform.Architecture -Language $Platform.Language -Type 'Msp' 20 | break 21 | } 22 | 23 | $SearchCount-- 24 | } until ($SearchCount -eq 0) 25 | 26 | if ($SearchCount -eq 0) { 27 | Write-Warning "Could not find release for Adobe Acrobat $($Platform.Architecture) $($Platform.Language)" 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-AdobeAcrobatReader.ps1: -------------------------------------------------------------------------------- 1 | $Platforms = @( 2 | @{Architecture = 'x86'; Language = 'Neutral'; Pattern = 'AcroRdrDCUpd\d{8,12}\.msp'} 3 | @{Architecture = 'x86'; Language = 'Multi'; Pattern = 'AcroRdrDCUpd\d{8,12}_MUI\.msp'} 4 | @{Architecture = 'x64'; Language = 'Neutral'; Pattern = 'AcroRdrDCx64Upd\d{8,12}\.msp'} 5 | @{Architecture = 'x64'; Language = 'Multi'; Pattern = 'AcroRdrDCx64Upd\d{8,12}_MUI\.msp'} 6 | ) 7 | 8 | $Headers = @{'accept' = '*/*'; 'accept-language' = 'en-GB,en;q=0.9,en-US;q=0.8'} 9 | 10 | foreach ($Platform in $Platforms) { 11 | 12 | $ReleaseURL = 'https://www.adobe.com/devnet-docs/acrobatetk/tools/ReleaseNotesDC/index.html' 13 | $SearchCount = 5 14 | 15 | do { 16 | $ReleaseURL = Get-Link -Uri $ReleaseURL -Headers $Headers -MatchProperty outerHTML -Pattern '>Next' -PrefixParent 17 | 18 | $URL = Get-Link -Uri $ReleaseURL -Headers $Headers -MatchProperty href -Pattern $Platform.Pattern 19 | if ($URL) { 20 | $Version = ($URL | Get-Version -Pattern '(\d{8,12}).+msp') -replace '(\d{2})(\d{3})(\d+)','$1.$2.$3' 21 | New-NevergreenApp -Name 'Adobe Acrobat Reader' -Version $Version -Uri $URL -Architecture $Platform.Architecture -Language $Platform.Language -Type 'Msp' 22 | break 23 | } 24 | 25 | $SearchCount-- 26 | } until ($SearchCount -eq 0) 27 | 28 | if ($SearchCount -eq 0) { 29 | Write-Warning "Could not find release for Adobe Acrobat Reader $($Platform.Architecture) $($Platform.Language)" 30 | } 31 | 32 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-AdobeCreativeCloud.ps1: -------------------------------------------------------------------------------- 1 | $URL32,$URL64,$URLARM64 = Get-Link -Uri 'https://helpx.adobe.com/uk/download-install/kb/creative-cloud-desktop-app-download.html' -MatchProperty href -Pattern 'win32','win64','winarm64' -Headers @{'accept' = '*/*'; 'accept-language' = 'en-GB,en;q=0.9,en-US;q=0.8'} 2 | 3 | $Version32,$Version64,$VersionARM64 = $URL32,$URL64,$URLARM64 | Get-Version -Pattern '((?:\d+\.)+\d+)(?!.+(?:\d+\.)+\d+)' -ReplaceWithDot 4 | 5 | New-NevergreenApp -Name 'Adobe Creative Cloud' -Version $Version32 -Uri $URL32 -Architecture 'x86' -Type 'Zip' 6 | New-NevergreenApp -Name 'Adobe Creative Cloud' -Version $Version64 -Uri $URL64 -Architecture 'x64' -Type 'Zip' 7 | New-NevergreenApp -Name 'Adobe Creative Cloud' -Version $VersionARM64 -Uri $URLARM64 -Architecture 'ARM64' -Type 'Zip' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-AdobeDigitalEditions.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $Headers = @{'accept' = '*/*'; 'accept-language' = 'en-GB,en;q=0.9,en-US;q=0.8'} 4 | $Version = Get-Link -Uri 'https://www.adobe.com/uk/solutions/ebook/digital-editions/download.html' -Headers $Headers -MatchProperty href -Pattern '\.exe$' -ReturnProperty outerHTML | Get-Version -Pattern '>((?:\d+\.)+\d+)' 5 | $URL = Get-Link -Uri 'https://www.adobe.com/uk/solutions/ebook/digital-editions/download.html' -Headers $Headers -MatchProperty href -Pattern '\.exe$' 6 | 7 | New-NevergreenApp -Name 'Adobe Digital Editions' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Exe' 8 | 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-AdoptiumTemurin.ps1: -------------------------------------------------------------------------------- 1 | $MajorVersions = @(8,11,16,17,18,19,20,21,22,23,24,25) 2 | $ImageTypes = @('JDK', 'JRE') 3 | $Architectures = @('x32','x64') 4 | 5 | foreach ($MajorVersion in $MajorVersions) { 6 | 7 | $ReleasesURL = "https://api.adoptium.net/v3/assets/latest/$MajorVersion/hotspot?release=latest&jvm_impl=hotspot&vendor=adoptium&" 8 | 9 | try { 10 | 11 | $Releases = Invoke-RestMethod -Uri $ReleasesURL -DisableKeepAlive -ErrorAction Stop 12 | 13 | foreach ($ImageType in $ImageTypes) { 14 | foreach ($Architecture in $Architectures) { 15 | 16 | $Release = $Releases | Where-Object { $_.binary.os -eq 'Windows' -and $_.binary.heap_size -eq 'Normal' -and $_.binary.image_type -eq $ImageType -and $_.binary.architecture -eq $Architecture } 17 | 18 | if ($Release) { 19 | if ($Release.Count -gt 1) { 20 | Write-Warning "Unexpected multiple releases returned for Eclipse Temeru Runtime $MajorVersion $ImageType $Architecture" 21 | } 22 | 23 | if ($Architecture -eq 'x32') { 24 | $Architecture = 'x86' 25 | } 26 | 27 | $Release | ForEach-Object { 28 | $Version = ($_.version.openjdk_version -Replace '-[a-z]','.') -Replace '^1\.8\.','8.' | Get-Version -ReplaceWithDot 29 | New-NevergreenApp -Name "Adoptium Temurin $ImageType" -Version $Version -Uri $_.binary.installer.link -Architecture $Architecture -Type 'Msi' 30 | New-NevergreenApp -Name "Adoptium Temurin $ImageType" -Version $Version -Uri $_.binary.package.link -Architecture $Architecture -Type 'Zip' 31 | } 32 | } 33 | 34 | } 35 | } 36 | } 37 | catch { 38 | Write-Error "$($MyInvocation.MyCommand): Error querying REST API $($ReleasesURL): $($_.Exception.Message)" 39 | } 40 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-AdvancedIPScanner.ps1: -------------------------------------------------------------------------------- 1 | $URL32 = Get-Link -Uri 'https://www.advanced-ip-scanner.com/download' -MatchProperty href -Pattern 'Advanced_IP_Scanner.+\.exe' 2 | $Version = $URL32 | Get-Version 3 | 4 | New-NevergreenApp -Name 'Advanced IP Scanner' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-AdvancedInstaller.ps1: -------------------------------------------------------------------------------- 1 | $URL = Get-Link -Uri 'https://www.advancedinstaller.com/downloading.html' -MatchProperty href -Pattern '\.msi$' -PrefixDomain 2 | 3 | $Version = Get-Link -Uri 'https://www.advancedinstaller.com/download.html' -MatchProperty title -Pattern 'Release Notes' | Get-Version 4 | 5 | New-NevergreenApp -Name 'Advanced Installer' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Msi' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-AdvancedPortScanner.ps1: -------------------------------------------------------------------------------- 1 | $URL32 = Get-Link -Uri 'https://www.advanced-port-scanner.com' -MatchProperty href -Pattern 'Advanced_Port_Scanner.+\.exe' 2 | $Version = $URL32 | Get-Version 3 | 4 | New-NevergreenApp -Name 'Advanced Port Scanner' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-Anaconda.ps1: -------------------------------------------------------------------------------- 1 | $URL = Get-Link -Uri 'https://www.anaconda.com/download/success' -MatchProperty href -Pattern '\.exe$' 2 | $Version = $URL | Get-Version 3 | New-NevergreenApp -Name 'Anaconda' -Version $Version -Uri $URL -Architecture 'x64' -Type 'exe' 4 | -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-AppleiTunes.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | #API that iTunes queries is only returning a 3-part version number, other sources below use 4 parts but are not direct from Apple. Monitor next update to see which is best. 4 | $Version = Get-Version -Uri 'https://s.mzstatic.com/version' -Pattern 'iTunesWindowsVersion\s+((?:\d+\.)+\d+)' -ErrorAction Stop 5 | 6 | #$Version = ((Invoke-WebRequest -Uri 'https://en.wikipedia.org/wiki/History_of_iTunes' -DisableKeepAlive -UseBasicParsing).Content | Select-String -Pattern '

((?:\d+\.)+\d+)\s

\s' -AllMatches)[-1].Matches[-1].Groups[1].Value 7 | #$Version = (Invoke-RestMethod -Uri 'https://community.chocolatey.org/api/v2/Packages()?$filter=(tolower(Id)%20eq%20''itunes'')%20and%20IsLatestVersion' -DisableKeepAlive).Properties.Version 8 | 9 | $URL64 = (Resolve-Uri -Uri 'https://www.apple.com/itunes/download/win64').Uri 10 | $URL32 = (Resolve-Uri -Uri 'https://www.apple.com/itunes/download/win32').Uri 11 | 12 | New-NevergreenApp -Name 'Apple iTunes' -Version $Version -Uri $URL64 -Architecture 'x64' -Type 'Exe' 13 | New-NevergreenApp -Name 'Apple iTunes' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Exe' 14 | } 15 | catch { 16 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 17 | } 18 | -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-AutoIt.ps1: -------------------------------------------------------------------------------- 1 | $Version = Get-Version -Uri 'https://www.autoitscript.com/site/autoit/downloads' -Pattern 'v((?:\d+\.)+\d+)' 2 | 3 | $URL32 = (Get-Link -Uri 'https://www.autoitscript.com/site/autoit/downloads' -MatchProperty href -Pattern 'autoit-v.+-setup\.zip' -PrefixDomain | Resolve-Uri).Uri.Replace('.zip','.exe') 4 | 5 | New-NevergreenApp -Name 'AutoIt' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-CiscoWebex.ps1: -------------------------------------------------------------------------------- 1 | $Version = Get-Version -Uri 'https://help.webex.com/en-us/article/mqkve8/Webex-App-%7C-Release-notes' -Pattern 'Windows[^\d]+((?:\d+\.)+(?:\d+))' 2 | 3 | $URL = Get-Link -Uri 'https://help.webex.com/en-us/article/nw5p67g/Webex-App-%7C-Installation-and-automatic-upgrade' -MatchProperty href -Pattern 'Webex\.msi' 4 | $URLEN = Get-Link -Uri 'https://help.webex.com/en-us/article/nw5p67g/Webex-App-%7C-Installation-and-automatic-upgrade' -MatchProperty href -Pattern 'Webex_en\.msi' 5 | $URLBundle = Get-Link -Uri 'https://help.webex.com/en-us/article/nw5p67g/Webex-App-%7C-Installation-and-automatic-upgrade' -MatchProperty href -Pattern 'WebexBundle\.msi' 6 | $URLBundleEN = Get-Link -Uri 'https://help.webex.com/en-us/article/nw5p67g/Webex-App-%7C-Installation-and-automatic-upgrade' -MatchProperty href -Pattern 'WebexBundle_en\.msi' 7 | 8 | New-NevergreenApp -Name 'Cisco Webex' -Version $Version -Uri $URL -Architecture 'x64' -Type 'Msi' -Language 'Multi' 9 | New-NevergreenApp -Name 'Cisco Webex' -Version $Version -Uri $URLEN -Architecture 'x64' -Type 'Msi' -Language 'en' 10 | New-NevergreenApp -Name 'Cisco Webex Bundle' -Version $Version -Uri $URLBundle -Architecture 'x64' -Type 'Msi' -Language 'Multi' 11 | New-NevergreenApp -Name 'Cisco Webex Bundle' -Version $Version -Uri $URLBundleEN -Architecture 'x64' -Type 'Msi' -Language 'en' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-CiscoWebexAccessAnywhere.ps1: -------------------------------------------------------------------------------- 1 | $RetryCount = 3 2 | 3 | for ($i = 0; $i -lt $RetryCount; $i++) { 4 | try { 5 | $Version = ((Invoke-WebRequest 'https://welcome.webex.com/svc3300/svccomponents/support/siteAbout.do?serviceID=9&siteurl=welcome' -DisableKeepAlive -UseBasicParsing -ErrorAction Stop).Content | Select-String -Pattern '(?:\d+\.)+(?:\d+)' -AllMatches).Matches.Groups.Value | Select-Object -Skip 1 -First 1 6 | $URL32 = "https://welcome.webex.com/client/T33L/aainstall.msi" 7 | New-NevergreenApp -Name 'Cisco Webex Access Anyhwere' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Msi' 8 | break 9 | } 10 | catch { 11 | Write-Warning "Attempt $($i+1) failed, retrying... $_" 12 | } 13 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-CiscoWebexSupportManager.ps1: -------------------------------------------------------------------------------- 1 | $RetryCount = 3 2 | 3 | for ($i = 0; $i -lt $RetryCount; $i++) { 4 | try { 5 | $Version = ((Invoke-WebRequest 'https://welcome.webex.com/sc3300/supportcenter/site/siteabout.do?siteurl=welcome' -DisableKeepAlive -UseBasicParsing -ErrorAction Stop).Content | Select-String -Pattern '(?:\d+\.)+(?:\d+)' -AllMatches).Matches.Groups.Value | Select-Object -Skip 1 -First 1 6 | $URL32 = Get-Link -Uri 'https://welcome.webex.com/sc3300/supportcenter/site/downloads.do?siteurl=welcome' -MatchProperty href -Pattern 'webexsc\.msi$' 7 | New-NevergreenApp -Name 'Cisco Webex Support Manager' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Msi' 8 | break 9 | } 10 | catch { 11 | Write-Warning "Attempt $($i+1) failed, retrying..." 12 | } 13 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-CitrixShareFile.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $Version = Get-Version -Uri 'https://www.citrix.com/downloads/sharefile/clients-and-plug-ins/citrix-files-for-windows.html' -Pattern 'ShareFile for Windows v((?:\d+\.)+\d+)' 4 | 5 | $URLMsi = Get-Link -Uri 'https://www.citrix.com/downloads/sharefile/clients-and-plug-ins/citrix-files-for-windows.html' -MatchProperty outerHTML -Pattern '\.msi' -ReturnProperty outerHTML 6 | if ($URLMsi -match 'rel="(//.+\.msi[^"]+)') { 7 | $URLMsi = "https:" + $Matches[1] 8 | New-NevergreenApp -Name 'Citrix Files' -Version $Version -Uri $URLMsi -Architecture 'x64' -Type 'Msi' 9 | } 10 | 11 | $URLExe = Get-Link -Uri 'https://www.citrix.com/downloads/sharefile/clients-and-plug-ins/citrix-files-for-windows.html' -MatchProperty outerHTML -Pattern '\.exe' -ReturnProperty outerHTML 12 | if ($URLExe -match 'rel="(//.+\.exe[^"]+)') { 13 | $URLExe = "https:" + $Matches[1] 14 | New-NevergreenApp -Name 'Citrix Files' -Version $Version -Uri $URLExe -Architecture 'Multi' -Type 'Exe' 15 | } 16 | 17 | } 18 | catch { 19 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 20 | } 21 | -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-DruideAntidote.ps1: -------------------------------------------------------------------------------- 1 | $Apps = @( 2 | @{Name = 'Antidote'; Architecture = 'x86'; Type = 'Msp'; Pattern = 'Diff_Antidote_10_C_(?:\d+\.)+(?:\d+)\.msp$' } 3 | @{Name = 'Antidote French Module'; Architecture = 'x86'; Type = 'Msp'; Pattern = 'Diff_Antidote_10_Module_F_(?:\d+\.)+(?:\d+)\.msp$' } 4 | @{Name = 'Antidote English Module'; Architecture = 'x86'; Type = 'Msp'; Pattern = 'Diff_Antidote_10_Module_E_(?:\d+\.)+(?:\d+)\.msp$' } 5 | @{Name = 'Connectix'; Architecture = 'x86'; Type = 'Msp'; Pattern = 'Diff_Connectix_10_C_(?:\d+\.)+(?:\d+)\.msp$' } 6 | ) 7 | 8 | foreach ($App in $Apps) { 9 | try { 10 | $URL = Get-Link -Uri 'https://www.antidote.info/fr/assistance/mises-a-jour/installation/antidote-10/windows' -MatchProperty href -Pattern $App.Pattern 11 | $Version = $URL | Get-Version 12 | New-NevergreenApp -Name $App.Name -Version $Version -Uri $URL -Architecture $App.Architecture -Type $App.Type 13 | } 14 | catch { 15 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 16 | } 17 | } 18 | 19 | try { 20 | $URL = 'https://telechargement.druide.com/telecharger/Reseau/antidote_10/GestionnaireMultiposte_Antidote10.exe' 21 | New-NevergreenApp -Name 'Multi-User Manager' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Exe' 22 | } 23 | catch { 24 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 25 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-Elgato4KCaptureUtility.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | $Response = Invoke-RestMethod "https://www.elgato.com/graphql?query=query%20contentJson(%24identifier%3A%5BString%5D%24contentType%3AString%24options%3AContentJsonOptionsInput)%7BcontentJson(identifiers%3A%24identifier%20contentType%3A%24contentType%20options%3A%24options)%7Bidentifier%20entries%7D%7D&operationName=contentJson&variables=%7B%22contentType%22%3A%22downloads%22%2C%22identifier%22%3A%5B%22downloads%22%5D%2C%22options%22%3A%7B%22level%22%3A1%7D%7D&locale=en-US" -ErrorAction Stop 3 | $Product = ($Response.data.contentJson.entries | ConvertFrom-Json).downloadData.'4kcu-win' 4 | 5 | $URLVersion = Get-Version -String $Product.downloadURL -Pattern '((?:\d+\.)+\d+)(?!.+(?:\d+\.)+\d+)' 6 | if ([version]$URLVersion -gt [version]$Product.version) { 7 | $Product.version = $URLVersion 8 | } 9 | 10 | New-NevergreenApp -Name 'Elgato 4K Capture Utility' -Version $Product.version -Uri $Product.downloadURL -Architecture 'x64' -Type 'MSI' 11 | } 12 | catch { 13 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 14 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-ElgatoAudioEffects.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | $Response = Invoke-RestMethod "https://www.elgato.com/graphql?query=query%20contentJson(%24identifier%3A%5BString%5D%24contentType%3AString%24options%3AContentJsonOptionsInput)%7BcontentJson(identifiers%3A%24identifier%20contentType%3A%24contentType%20options%3A%24options)%7Bidentifier%20entries%7D%7D&operationName=contentJson&variables=%7B%22contentType%22%3A%22downloads%22%2C%22identifier%22%3A%5B%22downloads%22%5D%2C%22options%22%3A%7B%22level%22%3A1%7D%7D&locale=en-US" -ErrorAction Stop 3 | $Product = ($Response.data.contentJson.entries | ConvertFrom-Json).downloadData.'audio-effects-win' 4 | 5 | $URLVersion = Get-Version -String $Product.downloadURL -Pattern '((?:\d+\.)+\d+)(?!.+(?:\d+\.)+\d+)' 6 | if ([version]$URLVersion -gt [version]$Product.version) { 7 | $Product.version = $URLVersion 8 | } 9 | 10 | New-NevergreenApp -Name 'Elgato Audio Effects' -Version $Product.version -Uri $Product.downloadURL -Architecture 'x64' -Type 'MSI' 11 | } 12 | catch { 13 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 14 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-ElgatoCameraHub.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | $Response = Invoke-RestMethod "https://www.elgato.com/graphql?query=query%20contentJson(%24identifier%3A%5BString%5D%24contentType%3AString%24options%3AContentJsonOptionsInput)%7BcontentJson(identifiers%3A%24identifier%20contentType%3A%24contentType%20options%3A%24options)%7Bidentifier%20entries%7D%7D&operationName=contentJson&variables=%7B%22contentType%22%3A%22downloads%22%2C%22identifier%22%3A%5B%22downloads%22%5D%2C%22options%22%3A%7B%22level%22%3A1%7D%7D&locale=en-US" -ErrorAction Stop 3 | $Product = ($Response.data.contentJson.entries | ConvertFrom-Json).downloadData.'camera-hub-win' 4 | 5 | $URLVersion = Get-Version -String $Product.downloadURL -Pattern '((?:\d+\.)+\d+)(?!.+(?:\d+\.)+\d+)' 6 | if ([version]$URLVersion -gt [version]$Product.version) { 7 | $Product.version = $URLVersion 8 | } 9 | 10 | New-NevergreenApp -Name 'Elgato Camera Hub' -Version $Product.version -Uri $Product.downloadURL -Architecture 'x64' -Type 'MSI' 11 | } 12 | catch { 13 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 14 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-ElgatoControlCenter.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | $Response = Invoke-RestMethod "https://www.elgato.com/graphql?query=query%20contentJson(%24identifier%3A%5BString%5D%24contentType%3AString%24options%3AContentJsonOptionsInput)%7BcontentJson(identifiers%3A%24identifier%20contentType%3A%24contentType%20options%3A%24options)%7Bidentifier%20entries%7D%7D&operationName=contentJson&variables=%7B%22contentType%22%3A%22downloads%22%2C%22identifier%22%3A%5B%22downloads%22%5D%2C%22options%22%3A%7B%22level%22%3A1%7D%7D&locale=en-US" -ErrorAction Stop 3 | $Product = ($Response.data.contentJson.entries | ConvertFrom-Json).downloadData.'cc-win' 4 | 5 | $URLVersion = Get-Version -String $Product.downloadURL -Pattern '((?:\d+\.)+\d+)(?!.+(?:\d+\.)+\d+)' 6 | if ([version]$URLVersion -gt [version]$Product.version) { 7 | $Product.version = $URLVersion 8 | } 9 | 10 | New-NevergreenApp -Name 'Elgato Control Center' -Version $Product.version -Uri $Product.downloadURL -Architecture 'x64' -Type 'MSI' 11 | } 12 | catch { 13 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 14 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-ElgatoGameCapture.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | $Response = Invoke-RestMethod "https://www.elgato.com/graphql?query=query%20contentJson(%24identifier%3A%5BString%5D%24contentType%3AString%24options%3AContentJsonOptionsInput)%7BcontentJson(identifiers%3A%24identifier%20contentType%3A%24contentType%20options%3A%24options)%7Bidentifier%20entries%7D%7D&operationName=contentJson&variables=%7B%22contentType%22%3A%22downloads%22%2C%22identifier%22%3A%5B%22downloads%22%5D%2C%22options%22%3A%7B%22level%22%3A1%7D%7D&locale=en-US" -ErrorAction Stop 3 | $Entries = $Response.data.contentJson.entries | ConvertFrom-Json 4 | New-NevergreenApp -Name 'Elgato Stream Deck' -Version $Entries.downloadData.'sd-win'.version -Uri $Entries.downloadData.'sd-win'.downloadURL -Architecture 'x64' -Type 'MSI' 5 | } 6 | catch { 7 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 8 | } 9 | 10 | 11 | #Elgato 4K Capture Utility = 4kcu-win 12 | #Elgato Audio Effects = audio-effects-win 13 | #Elgato Camera Hub = camera-hub-win 14 | #Elgato Control Center = cc-win 15 | #Elgato Game Capture = gc-win 16 | #Elgato Video Capture = vc-win 17 | #Elgato Wave Link = wave-link-win -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-ElgatoStreamDeck.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | $Response = Invoke-RestMethod "https://www.elgato.com/graphql?query=query%20contentJson(%24identifier%3A%5BString%5D%24contentType%3AString%24options%3AContentJsonOptionsInput)%7BcontentJson(identifiers%3A%24identifier%20contentType%3A%24contentType%20options%3A%24options)%7Bidentifier%20entries%7D%7D&operationName=contentJson&variables=%7B%22contentType%22%3A%22downloads%22%2C%22identifier%22%3A%5B%22downloads%22%5D%2C%22options%22%3A%7B%22level%22%3A1%7D%7D&locale=en-US" -ErrorAction Stop 3 | $Product = ($Response.data.contentJson.entries | ConvertFrom-Json).downloadData.'sd-win' 4 | 5 | $URLVersion = Get-Version -String $Product.downloadURL -Pattern '((?:\d+\.)+\d+)(?!.+(?:\d+\.)+\d+)' 6 | if ([version]$URLVersion -gt [version]$Product.version) { 7 | $Product.version = $URLVersion 8 | } 9 | 10 | New-NevergreenApp -Name 'Elgato Stream Deck' -Version $Product.version -Uri $Product.downloadURL -Architecture 'x64' -Type 'MSI' 11 | } 12 | catch { 13 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 14 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-ElgatoVideoCapture.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | $Response = Invoke-RestMethod "https://www.elgato.com/graphql?query=query%20contentJson(%24identifier%3A%5BString%5D%24contentType%3AString%24options%3AContentJsonOptionsInput)%7BcontentJson(identifiers%3A%24identifier%20contentType%3A%24contentType%20options%3A%24options)%7Bidentifier%20entries%7D%7D&operationName=contentJson&variables=%7B%22contentType%22%3A%22downloads%22%2C%22identifier%22%3A%5B%22downloads%22%5D%2C%22options%22%3A%7B%22level%22%3A1%7D%7D&locale=en-US" -ErrorAction Stop 3 | $Product = ($Response.data.contentJson.entries | ConvertFrom-Json).downloadData.'vc-win' 4 | 5 | $URLVersion = Get-Version -String $Product.downloadURL -Pattern '((?:\d+\.)+\d+)(?!.+(?:\d+\.)+\d+)' 6 | if ([version]$URLVersion -gt [version]$Product.version) { 7 | $Product.version = $URLVersion 8 | } 9 | 10 | New-NevergreenApp -Name 'Elgato Video Capture' -Version $Product.version -Uri $Product.downloadURL -Architecture 'x86' -Type 'MSI' 11 | } 12 | catch { 13 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 14 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-FileOpenPlugin.ps1: -------------------------------------------------------------------------------- 1 | $Releases = @( 2 | @{Architecture = 'Multi'; Type = 'exe'; Pattern = '\.exe$' } 3 | @{Architecture = 'x64'; Type = 'msi'; Pattern = '64\.msi$' } 4 | ) 5 | 6 | foreach ($Release in $Releases) { 7 | try { 8 | $URL = Get-Link -Uri 'https://plugin.fileopen.com/' -MatchProperty href -Pattern $Release.Pattern -PrefixDomain -ErrorAction Stop 9 | $Version = Get-Link -Uri 'https://plugin.fileopen.com/' -MatchProperty href -Pattern $Release.Pattern -ReturnProperty outerHTML -ErrorAction Stop | Get-Version -Pattern '\[(\d+(?:\.\d+)*)\]' 10 | New-NevergreenApp -Name 'FileOpen Plugin' -Version $Version -Uri $URL -Architecture $Release.Architecture -Type $Release.Type 11 | } 12 | catch { 13 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 14 | } 15 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-FujifilmPixelShiftCombiner.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $Version = Get-Version -Uri 'https://fujifilm-x.com/global/support/download/software/pixel-shift-combiner/' -Pattern 'Windows Version: (?:Ver\.)?((?:\d+\.)+\d+)' 4 | 5 | $URL = Get-Link -Uri 'https://fujifilm-x.com/global/support/download/software/pixel-shift-combiner/' -MatchProperty href -Pattern '\.exe$' 6 | 7 | New-NevergreenApp -Name 'Fujifilm Pixel Shift Combiner' -Version $Version -Uri $URL -Architecture 'x64' -Type 'Exe' 8 | 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-FujifilmRawFileconverterEx.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $Version = Get-Version -Uri 'https://fujifilm-x.com/en-gb/support/download/software/raw-file-converter-ex-powered-by-silkypix/' -Pattern 'Windows Version: (?:Ver\.)?((?:\d+\.)+\d+)' 4 | 5 | $URL = Get-Link -Uri 'https://fujifilm-x.com/en-gb/support/download/software/raw-file-converter-ex-powered-by-silkypix/' -MatchProperty href -Pattern '\.exe$' 6 | 7 | New-NevergreenApp -Name 'Fujifilm Raw File Converter EX 3.0' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Exe' 8 | 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-FujifilmXAcquire.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $Version = Get-Version -Uri 'https://fujifilm-x.com/en-gb/support/download/software/x-acquire/' -Pattern 'Windows Version: (?:Ver\.)?((?:\d+\.)+\d+)' 4 | 5 | $URL = Get-Link -Uri 'https://fujifilm-x.com/en-gb/support/download/software/x-acquire/' -MatchProperty href -Pattern '\.exe$' 6 | 7 | New-NevergreenApp -Name 'Fujifilm X Acquire' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Exe' 8 | 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-FujifilmXRawStudio.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $Version = Get-Version -Uri 'https://fujifilm-x.com/en-gb/support/download/software/x-raw-studio/' -Pattern 'Windows Version: (?:Ver\.)?((?:\d+\.)+\d+)' 4 | 5 | $URL = Get-Link -Uri 'https://fujifilm-x.com/en-gb/support/download/software/x-raw-studio/' -MatchProperty href -Pattern '\.exe$' 6 | 7 | New-NevergreenApp -Name 'Fujifilm X Raw Studio' -Version $Version -Uri $URL -Architecture 'x64' -Type 'Exe' 8 | 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-FujifilmXWebcam.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $Version = Get-Version -Uri 'https://fujifilm-x.com/en-gb/support/download/software/x-webcam/' -Pattern 'Windows Version: (?:Ver\.)?((?:\d+\.)+\d+)' 4 | 5 | $URL = Get-Link -Uri 'https://fujifilm-x.com/en-gb/support/download/software/x-webcam/' -MatchProperty href -Pattern '\.zip$' 6 | 7 | New-NevergreenApp -Name 'Fujifilm X Webcam' -Version $Version -Uri $URL -Architecture 'x64' -Type 'Zip' 8 | 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-GoogleDrive.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | $Response = (Invoke-RestMethod -Uri 'https://update.googleapis.com/service/update2' -Method Post -DisableKeepAlive -Body '').response 3 | $Version = $Response.app.updatecheck.manifest.version 4 | $URL = @($Response.app.updatecheck.urls.url.codebase)[-1] + $Response.app.updatecheck.manifest.packages.package.name 5 | $SHA256 = $Response.app.updatecheck.manifest.packages.package.hash_sha256 6 | 7 | New-NevergreenApp -Name 'Google Drive' -Version $Version -Uri $URL -Architecture 'Multi' -Type 'Exe' -SHA256 $SHA256 8 | } 9 | catch { 10 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 11 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-GoogleEarthPro.ps1: -------------------------------------------------------------------------------- 1 | $Apps = @( 2 | @{Architecture = 'x86'; Type = 'Exe'; Pattern = '(?:\d+\.)+\d+\.exe$' } 3 | @{Architecture = 'x64'; Type = 'Exe'; Pattern = '(?:\d+\.)+\d+-x64\.exe$' } 4 | ) 5 | 6 | foreach ($App in $Apps) { 7 | try { 8 | $URL = Get-Link -Uri 'https://support.google.com/earth/answer/168344' -MatchProperty href -Pattern $App.Pattern 9 | $Version = $URL | Get-Version 10 | New-NevergreenApp -Name 'Google Earth Pro' -Version $Version -Uri $URL -Architecture $App.Architecture -Type $App.Type 11 | } 12 | catch { 13 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 14 | } 15 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-HarmanAIR.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $URLRuntime = 'https://airsdk.harman.com/assets/downloads/AdobeAIR.exe' 4 | $ProgressPreference = 'SilentlyContinue' 5 | Invoke-WebRequest -Uri $URLRuntime -OutFile "$env:TEMP\AdobeAIR.exe" 6 | $VersionRuntime = (Get-Item -Path "$env:TEMP\AdobeAIR.exe").VersionInfo.FileVersion 7 | Remove-Item -Path "$env:TEMP\AdobeAIR.exe" -Force 8 | 9 | New-NevergreenApp -Name 'Harman AIR Runtime' -Channel 'Runtime' -Version $VersionRuntime -Uri $URLRuntime -Architecture 'x86' -Type 'Exe' 10 | 11 | $Response = (Invoke-RestMethod -Uri 'https://airsdk.harman.com/api/config-settings/download' -DisableKeepAlive).latestversion 12 | $VersionSDK = $Response.versionName 13 | $URLSDK = $Response.links.SDK_AS_WIN | Set-UriPrefix -Prefix 'https://airsdk.harman.com' 14 | $URLSDKFlex = $Response.links.SDK_FLEX_WIN | Set-UriPrefix -Prefix 'https://airsdk.harman.com' 15 | 16 | New-NevergreenApp -Name 'Harman AIR SDK' -Channel 'SDK ActionScript' -Version $VersionSDK -Uri $URLSDK -Architecture 'x86' -Type 'Zip' 17 | New-NevergreenApp -Name 'Harman AIR SDK' -Channel 'SDK Flex' -Version $VersionSDK -Uri $URLSDKFlex -Architecture 'x86' -Type 'Zip' 18 | 19 | } 20 | catch { 21 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 22 | } 23 | -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-IBMSemeruRuntime.ps1: -------------------------------------------------------------------------------- 1 | #$DownloadPage = (Invoke-WebRequest -Uri 'https://developer.ibm.com/languages/java/semeru-runtimes/downloads' -DisableKeepAlive).Content 2 | $DownloadPage = (Invoke-RestMethod -Uri 'https://developer.ibm.com/middleware/v1/contents/static/semeru-runtime-downloads' -DisableKeepAlive).results.pagepost_custom_js_value 3 | 4 | if ($DownloadPage -match 'let sourceDataJson = ([^;]+);') { 5 | $Downloads = (ConvertFrom-Json $matches[1]).Downloads | Where-Object os -EQ 'Windows' 6 | } 7 | 8 | foreach ($Download in $Downloads) { 9 | $Version = ($Download.name.Replace('+','.') -Replace '.+OpenJDK (.+)','$1') | Get-Version 10 | New-NevergreenApp -Name "IBM Semeru Runtime JDK" -Version $Version -Uri $Download.jdk.opt1.downloadlink -Architecture $Download.arch -Type (Get-Culture).TextInfo.ToTitleCase($Download.jdk.opt1.displayName) 11 | New-NevergreenApp -Name "IBM Semeru Runtime JDK" -Version $Version -Uri $Download.jdk.opt2.downloadlink -Architecture $Download.arch -Type (Get-Culture).TextInfo.ToTitleCase($Download.jdk.opt2.displayName) 12 | New-NevergreenApp -Name "IBM Semeru Runtime JRE" -Version $Version -Uri $Download.jre.opt1.downloadlink -Architecture $Download.arch -Type (Get-Culture).TextInfo.ToTitleCase($Download.jre.opt1.displayName) 13 | New-NevergreenApp -Name "IBM Semeru Runtime JRE" -Version $Version -Uri $Download.jre.opt2.downloadlink -Architecture $Download.arch -Type (Get-Culture).TextInfo.ToTitleCase($Download.jre.opt2.displayName) 14 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-IGELUniversalManagementSuite.ps1: -------------------------------------------------------------------------------- 1 | $URL64 = Get-Link -Uri 'https://www.igel.com/software-downloads/workspace-edition/' -MatchProperty 'data-filename' -Pattern 'setup-igel-ums-windows.+\.exe' -ReturnProperty 'data-filename' 2 | $Version = $URL64 | Get-Version 3 | 4 | New-NevergreenApp -Name 'IGEL Universal Management Suite' -Version $Version -Uri $URL64 -Architecture 'x64' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-IrfanView.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | $Version = Get-Version -Uri 'https://www.irfanview.com/main_history.htm' -Pattern 'Version ((?:\d+\.)+\d+)' 3 | 4 | $Apps = @( 5 | @{Name = 'IrfanView'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://fileforum.com/download/IrfanView/967963863/1'; Pattern = 'iview\d+_setup\.exe$'; Language = 'en' } 6 | @{Name = 'IrfanView'; Architecture = 'x64'; Type = 'Exe'; Uri = 'https://fileforum.com/download/IrfanView/967963863/1?64bit=1'; Pattern = 'iview\d+_x64_setup\.exe$'; Language = 'en' } 7 | @{Name = 'IrfanView Plugins'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://fileforum.com/download/IrfanView-PlugIns/1099412658/1'; Pattern = 'iview\d+_plugins_setup\.exe$'; Language = 'en' } 8 | @{Name = 'IrfanView Plugins'; Architecture = 'x64'; Type = 'Exe'; Uri = 'https://fileforum.com/download/IrfanView-PlugIns/1099412658/1?64bit=1'; Pattern = 'iview\d+_plugins_x64_setup\.exe$'; Language = 'en' } 9 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_deutsch\.exe$'; Language = 'de' } 10 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_deutsch\.zip$'; Language = 'de' } 11 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_russian\.exe$'; Language = 'ru' } 12 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_russian\.zip$'; Language = 'ru' } 13 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_chinese\.exe$'; Language = 'zh' } 14 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_chinese\.zip$'; Language = 'zh' } 15 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_spanish\.exe$'; Language = 'es' } 16 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_spanish\.zip$'; Language = 'es' } 17 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_portugues-Brasil\.exe$'; Language = 'pt-BR' } 18 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_portugues-Brasil\.zip$'; Language = 'pt-BR' } 19 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_japanese\.exe$'; Language = 'ja' } 20 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_japanese\.zip$'; Language = 'ja' } 21 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_italian\.exe$'; Language = 'it' } 22 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_italian\.zip$'; Language = 'it' } 23 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_nederlands\.exe$'; Language = 'nl-NL' } 24 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_nederlands\.zip$'; Language = 'nl-NL' } 25 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_polski\.exe$'; Language = 'pl' } 26 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_polski\.zip$'; Language = 'pl' } 27 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_portuguese\.exe$'; Language = 'pt-PT' } 28 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_portuguese\.zip$'; Language = 'pt-PT' } 29 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_ukrainian\.exe$'; Language = 'uk' } 30 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_ukrainian\.zip$'; Language = 'uk' } 31 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_finnish\.exe$'; Language = 'fi' } 32 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_finnish\.zip$'; Language = 'fi' } 33 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_hungarian\.exe$'; Language = 'hu' } 34 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_hungarian\.zip$'; Language = 'hu' } 35 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_czech\.exe$'; Language = 'cs' } 36 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_czech\.zip$'; Language = 'cs' } 37 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_french\.exe$'; Language = 'fr' } 38 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_french\.zip$'; Language = 'fr' } 39 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_slovak\.exe$'; Language = 'sk' } 40 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_slovak\.zip$'; Language = 'sk' } 41 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_arabic\.exe$'; Language = 'ar' } 42 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_arabic\.zip$'; Language = 'ar' } 43 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_estonian\.exe$'; Language = 'et' } 44 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_estonian\.exe$'; Language = 'et' } 45 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_slovenscina\.zip$'; Language = 'sl' } 46 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_slovenscina\.exe$'; Language = 'sl' } 47 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_romanian\.zip$'; Language = 'ro' } 48 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_romanian\.exe$'; Language = 'ro' } 49 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_turkish\.zip$'; Language = 'tr' } 50 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_turkish\.exe$'; Language = 'tr' } 51 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_lithuanian\.exe$'; Language = 'lt' } 52 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_lithuanian\.zip$'; Language = 'lt' } 53 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_swedish\.exe$'; Language = 'sv' } 54 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_swedish\.zip$'; Language = 'sv' } 55 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_hebrew\.exe$'; Language = 'he' } 56 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_hebrew\.zip$'; Language = 'he' } 57 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_bulgarian\.exe$'; Language = 'bg' } 58 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_bulgarian\.zip$'; Language = 'bg' } 59 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_catalan\.exe$'; Language = 'ca' } 60 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_catalan\.zip$'; Language = 'ca' } 61 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_korean\.exe$'; Language = 'ko' } 62 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_korean\.zip$'; Language = 'ko' } 63 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_english_gb\.exe$'; Language = 'en-GB' } 64 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_english_gb\.zip$'; Language = 'en-GB' } 65 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_dansk\.exe$'; Language = 'da' } 66 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_dansk\.zip$'; Language = 'da' } 67 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_latvian\.exe$'; Language = 'lv' } 68 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_latvian\.zip$'; Language = 'lv' } 69 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Exe'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_uzbek\.exe$'; Language = 'uz' } 70 | @{Name = 'IrfanView Language'; Architecture = 'x86'; Type = 'Zip'; Uri = 'https://www.irfanview.com/languages.htm'; Pattern = 'irfanview_lang_uzbek\.zip$'; Language = 'uz' } 71 | ) 72 | 73 | foreach ($App in $Apps) { 74 | try { 75 | $URL = Get-Link -Uri $App.Uri -MatchProperty href -Pattern $App.Pattern 76 | New-NevergreenApp -Name $App.Name -Version $Version -Uri $URL -Architecture $App.Architecture -Type $App.Type -Language $App.Language 77 | } 78 | catch { 79 | } 80 | } 81 | 82 | } 83 | catch { 84 | Write-Error "$($MyInvocation.MyCommand): Error querying 'https://www.irfanview.com/main_history.htm': $($_.Exception.Message)" 85 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-JabraDirect.ps1: -------------------------------------------------------------------------------- 1 | # Getting intermittent certificate errors from this URL. -SkipCertificateCheck on Invoke-WebRequest resolves it but that is PS7 only. 2 | # Have seen up to 31 retries needed, so a 50 retry loop implemented! 3 | 4 | $RetryCount = 50 5 | 6 | for ($i = 0; $i -lt $RetryCount; $i++) { 7 | try { 8 | $Version = Get-Version -Uri 'https://www.jabra.com/Support/release-notes/release-note-jabra-direct' -Pattern '((?:\d+\.)+\d+)
' -ErrorAction Stop 9 | $URL = Get-Link -Uri 'https://www.jabra.com/software-and-services/jabra-direct' -MatchProperty href -Pattern '/Jabra.+\.exe$' -ErrorAction Stop 10 | New-NevergreenApp -Name 'Jabra Direct' -Version $Version -Uri $URL -Architecture 'Multi' -Type 'exe' 11 | return 12 | } 13 | catch { 14 | Write-Verbose "Attempt $($i+1) failed, retrying... $_" 15 | } 16 | } 17 | Write-Error $error[0] -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-KLiteCodecPack.ps1: -------------------------------------------------------------------------------- 1 | $Apps = @( 2 | @{Name = 'K-Lite Codec Pack'; Channel ='Basic'; Architecture = 'Multi'; Type = 'Exe'; Uri = 'https://www.codecguide.com/download_k-lite_codec_pack_basic.htm' } 3 | @{Name = 'K-Lite Codec Pack'; Channel ='Standard'; Architecture = 'Multi'; Type = 'Exe'; Uri = 'https://www.codecguide.com/download_k-lite_codec_pack_standard.htm' } 4 | @{Name = 'K-Lite Codec Pack'; Channel ='Full'; Architecture = 'Multi'; Type = 'Exe'; Uri = 'https://www.codecguide.com/download_k-lite_codec_pack_full.htm' } 5 | @{Name = 'K-Lite Codec Pack'; Channel ='Mega'; Architecture = 'Multi'; Type = 'Exe'; Uri = 'https://www.codecguide.com/download_k-lite_codec_pack_mega.htm' } 6 | ) 7 | 8 | foreach ($App in $Apps) { 9 | try { 10 | $Version = Get-Version -Uri $App.Uri -Pattern 'Version ((?:\d+\.)+\d+)' 11 | $URL = Get-Link -Uri $App.Uri -MatchProperty href -Pattern "\.$($App.Type)$" 12 | New-NevergreenApp -Name $App.Name -Version $Version -Uri $URL -Channel $App.Channel -Architecture $App.Architecture -Type $App.Type 13 | } 14 | catch { 15 | Write-Error "$($MyInvocation.MyCommand): Error querying '$($App.Uri)': $($_.Exception.Message)" 16 | } 17 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-KomodoLabsNEWTPro.ps1: -------------------------------------------------------------------------------- 1 | $Version = Get-Version -Uri 'https://www.komodolabs.com/product-downloads' -Pattern 'NEWT Professional v((?:\d+\.)+\d+)' 2 | 3 | $URL32 = Get-Link -Uri 'https://www.komodolabs.com/product-downloads' -MatchProperty href -Pattern 'newtpro\.exe$' -PrefixDomain 4 | 5 | New-NevergreenApp -Name 'Komodo Labs NEWT Pro' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-KomodoLabsSlitheris.ps1: -------------------------------------------------------------------------------- 1 | $Version = Get-Version -Uri 'https://www.komodolabs.com/product-downloads' -Pattern 'Slitheris Network Discovery v((?:\d+\.)+\d+)' 2 | 3 | $URL32 = Get-Link -Uri 'https://www.komodolabs.com/product-downloads' -MatchProperty href -Pattern 'slitheris_installer\.exe$' -PrefixDomain 4 | 5 | New-NevergreenApp -Name 'Komodo Labs Slitheris' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-LSoftActiveBootDisk.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | $URL = Get-Link -Uri 'https://www.boot-disk.com/index.html' -MatchProperty href -Pattern 'BootDisk.+\.exe$' 3 | $Version = Get-Version -Uri 'https://www.boot-disk.com/history.htm' -Pattern '((?:\d+\.?)+\d+)' 4 | 5 | New-NevergreenApp -Name 'LSoft Active@ Boot Disk' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Exe' 6 | } 7 | catch { 8 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 9 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-LSoftActiveDiskImageLite.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | $URL = Get-Link -Uri 'https://www.disk-image.com/download.htm' -MatchProperty href -Pattern 'Free\S+\.exe$' -PrefixDomain 3 | $Version = Get-Version -Uri 'https://www.disk-image.com/history.htm' -Pattern '((?:\d+\.)+\d+)' 4 | 5 | New-NevergreenApp -Name 'LSoft Active@ Disk Image Lite' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Exe' 6 | } 7 | catch { 8 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 9 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-LenovoCommercialVantage.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | $ScriptURL = Get-Version -Uri 'https://support.lenovo.com/gb/en/solutions/hf003321-lenovo-vantage-for-enterprise' -Pattern '(/gb/en/api/v4/contents/cdn/\S+\.js)' 3 | $Version = Get-Version -Uri "https://support.lenovo.com$ScriptURL" -Pattern 'Version ((?:\d+\.)+\d+)' 4 | 5 | $URL32 = Get-Version -Uri "https://support.lenovo.com$ScriptURL" -Pattern 'href=\\"(https://.+LenovoCommercialVantage.+zip)' 6 | 7 | New-NevergreenApp -Name 'Lenovo Commercial Vantage' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Zip' 8 | } 9 | catch { 10 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 11 | } 12 | -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-LibreOffice.ps1: -------------------------------------------------------------------------------- 1 | $Branches = @('Latest','Previous') 2 | $Architectures = @('x86_64','x86') 3 | $Language = 'en-GB' 4 | 5 | foreach ($Branch in $Branches) { 6 | 7 | try { 8 | $Version = Get-Version -Uri 'https://www.libreoffice.org/download/release-notes' -Pattern "LibreOffice ((?:\d+\.)+\d+)[^<]+$Branch" -ErrorAction Stop 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | break 13 | } 14 | 15 | foreach ($Architecture in $Architectures) { 16 | 17 | try { 18 | $DownloadPage = Get-Link -Uri "https://www.libreoffice.org/download/download-libreoffice/?type=win-$Architecture&version=$Version&lang=$Language" -MatchProperty href -Pattern "$Version[^`"]+$($Architecture.Substring($Architecture.Length-2,2))\.msi$" -ErrorAction Stop 19 | $URL = (Get-Link -Uri $DownloadPage -MatchProperty href -Pattern "$Version[^`"]+$($Architecture.Substring($Architecture.Length-2,2))\.msi$" -ErrorAction Stop) -replace '^//','https://' 20 | New-NevergreenApp -Name 'LibreOffice' -Version $Version -Uri $URL -Architecture $Architecture.Replace('86_','') -Type 'msi' -Channel $Branch -Language 'Multi' 21 | } 22 | catch { 23 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-LibreOfficeHelp.ps1: -------------------------------------------------------------------------------- 1 | $Branches = @('Latest','Previous') 2 | $Architectures = @('x86_64','x86') 3 | $Languages = (Invoke-WebRequest -Uri 'https://www.libreoffice.org/download/download/?lang=pick' -DisableKeepAlive).Links | Where-Object href -Match 'lang=' | Select-Object -ExpandProperty href | ForEach-Object { $_ -replace '.+lang=(.+)','$1' } | Sort-Object 4 | 5 | foreach ($Branch in $Branches) { 6 | 7 | try { 8 | $Version = Get-Version -Uri 'https://www.libreoffice.org/download/release-notes' -Pattern "LibreOffice ((?:\d+\.)+\d+)[^<]+$Branch" 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | break 13 | } 14 | 15 | foreach ($Architecture in $Architectures) { 16 | 17 | foreach ($Language in $Languages) { 18 | 19 | try { 20 | $URL = Get-Link -Uri "https://www.libreoffice.org/download/download/?type=win-$Architecture&version=$Version&lang=$Language" -MatchProperty href -Pattern "$Version.+$($Architecture.Replace('86_',''))_helppack_$Language\.msi$" 21 | 22 | if ($URL) { 23 | New-NevergreenApp -Name 'LibreOffice Offline Help' -Version $Version -Uri $URL -Architecture $Architecture.Replace('86_','') -Type 'MSI' -Channel $Branch -Language $Language 24 | } 25 | } 26 | catch { 27 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 28 | } 29 | 30 | } 31 | 32 | } 33 | 34 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-LogitechCameraSettings.ps1: -------------------------------------------------------------------------------- 1 | $DownloadPageURL = ((Invoke-RestMethod -Uri 'https://support.logi.com/api/v2/help_center/en-gb/articles.json?label_names=webcontent=productdownload,websoftware=9bf6fc93-8e0b-11e9-a62b-cb4c7fb3c2e2,webos=windows-Windows-10' -DisableKeepAlive).articles | Where-Object title -EQ 'Camera Settings').html_url 2 | 3 | $URL32 = Get-Link -Uri $DownloadPageURL -MatchProperty href -Pattern 'LogiCameraSettings.+\.exe' 4 | $Version = $URL32 | Get-Version 5 | 6 | New-NevergreenApp -Name 'Logitech Camera Settings' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-MicrosoftAzureCLI.ps1: -------------------------------------------------------------------------------- 1 | $URL32 = (Resolve-Uri -Uri 'https://aka.ms/installazurecliwindows').Uri 2 | $Version = $URL32 | Get-Version 3 | 4 | New-NevergreenApp -Name 'Microsoft AzureCLI' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Msi' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-MicrosoftOfficeDeploymentTool.ps1: -------------------------------------------------------------------------------- 1 | # Get Office Deployment Tool details by using the JSON-Object of the 2 | # Javascript to get the download details. 3 | $DownloadPageUri = 'https://www.microsoft.com/en-us/download/details.aspx?id=49117' 4 | # Pattern to get the JSON-Object by matching the 5 | # script start block + variable declaration to the script end block. 6 | $JSONBlobPattern = '(?)' 7 | 8 | $Data = Invoke-WebRequest -Uri $DownloadPageUri ` 9 | | Select-Object -Property 'Content' ` 10 | | Select-String -Pattern $JSONBlobPattern ` 11 | | Select-Object -ExpandProperty 'Matches' ` 12 | | ForEach-Object {$_.Groups['JSObject'].Value} ` 13 | | Select-Object -First 1 ` 14 | | ConvertFrom-JSON 15 | 16 | New-NeverGreenApp ` 17 | -Name 'Microsoft Office Deployment Tool' ` 18 | -Uri $Data.dlcDetailsView.downloadFile.url ` 19 | -Version $Data.dlcDetailsView.downloadFile.Version ` 20 | -Architecture 'Multi' ` 21 | -Type 'Exe' 22 | -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-MicrosoftOpenJDK.ps1: -------------------------------------------------------------------------------- 1 | $Releases = @( 2 | @{Architecture = 'x64'; Type = 'msi'; Pattern = 'microsoft-jdk-11.+x64\.msi$'} 3 | @{Architecture = 'x64'; Type = 'zip'; Pattern = 'microsoft-jdk-11.+x64\.zip$'} 4 | @{Architecture = 'ARM64'; Type = 'msi'; Pattern = 'microsoft-jdk-11.+aarch64\.msi$'} 5 | @{Architecture = 'ARM64'; Type = 'zip'; Pattern = 'microsoft-jdk-11.+aarch64\.zip$'} 6 | @{Architecture = 'x64'; Type = 'msi'; Pattern = 'microsoft-jdk-17.+x64\.msi$'} 7 | @{Architecture = 'x64'; Type = 'zip'; Pattern = 'microsoft-jdk-17.+x64\.zip$'} 8 | @{Architecture = 'ARM64'; Type = 'msi'; Pattern = 'microsoft-jdk-17.+aarch64\.msi$'} 9 | @{Architecture = 'ARM64'; Type = 'zip'; Pattern = 'microsoft-jdk-17.+aarch64\.zip$'} 10 | ) 11 | 12 | foreach ($Release in $Releases) { 13 | try { 14 | $URL = Get-Link -Uri 'https://docs.microsoft.com/en-gb/java/openjdk/download' -MatchProperty href -Pattern $Release.Pattern -ErrorAction Stop 15 | $Version = $URL | Get-Version 16 | New-NevergreenApp -Name 'Microsoft OpenJDK' -Version $Version -Uri $URL -Architecture $Release.Architecture -Type $Release.Type 17 | } 18 | catch { 19 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 20 | } 21 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-MicrosoftPowerBIDesktop.ps1: -------------------------------------------------------------------------------- 1 | $Version = Get-Version -Uri 'https://www.microsoft.com/download/details.aspx?id=58494' -Pattern 'Version:<.+?>((?:\d+\.)+\d+)' 2 | $URL32 = Get-Link -Uri 'https://www.microsoft.com/en-us/download/confirmation.aspx?id=58494' -MatchProperty href -Pattern 'PBIDesktopSetup\.exe$' 3 | $URL64 = Get-Link -Uri 'https://www.microsoft.com/en-us/download/confirmation.aspx?id=58494' -MatchProperty href -Pattern 'PBIDesktopSetup_x64\.exe$' 4 | 5 | New-NevergreenApp -Name 'Microsoft Power BI Desktop' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Exe' 6 | New-NevergreenApp -Name 'Microsoft Power BI Desktop' -Version $Version -Uri $URL64 -Architecture 'x64' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-MicrosoftPowerBIReportBuilder.ps1: -------------------------------------------------------------------------------- 1 | $Version = Get-Version -Uri 'https://www.microsoft.com/en-us/download/details.aspx?id=105942' -Pattern 'Version:<.+?>((?:\d+\.)+\d+)' #'Version:\s+

((?:\d+\.)+\d+)' 2 | $URL32 = Get-Link -Uri 'https://www.microsoft.com/en-us/download/confirmation.aspx?id=105942' -MatchProperty href -Pattern '\.msi$' 3 | 4 | New-NevergreenApp -Name 'Microsoft Power BI Report Builder' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Msi' 5 | -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-MicrosoftPurviewInformationProtection.ps1: -------------------------------------------------------------------------------- 1 | $Response = Invoke-WebRequest -Uri 'https://www.microsoft.com/en-us/download/details.aspx?id=53018' -DisableKeepAlive -UseBasicParsing 2 | 3 | $Version = $Response.Content | Get-Version -Pattern '"version":"((?:\d+\.)+\d+)' 4 | $URLMsi = $Response.Content | Get-Version -Pattern '"(https://[^"]*\.msi)' 5 | $URLExe = $Response.Content | Get-Version -Pattern '"(https://[^"]*\.exe)' 6 | 7 | New-NevergreenApp -Name 'Microsoft Purview Information Protection' -Version $Version -Uri $URLMsi -Architecture 'x86' -Type 'MSI' 8 | New-NevergreenApp -Name 'Microsoft Purview Information Protection' -Version $Version -Uri $URLExe -Architecture 'x86' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-MicrosoftSSMS.ps1: -------------------------------------------------------------------------------- 1 | $URL64 = (Resolve-Uri -Uri 'https://aka.ms/ssmsfullsetup').Uri 2 | 3 | $Version = Get-Version -Uri 'https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms' -Pattern 'Release number: ((?:\d+\.)+\d+)' 4 | 5 | New-NevergreenApp -Name 'Microsoft SSMS' -Version $Version -Uri $URL64 -Architecture 'x64' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-MicrosoftSysinternals.ps1: -------------------------------------------------------------------------------- 1 | $BaseURL = 'https://docs.microsoft.com/en-us/sysinternals/downloads' 2 | $Links = (Invoke-WebRequest -Uri $BaseURL -DisableKeepAlive -UseBasicParsing).Links | Where-Object outerHTML -Match 'data-linktype' 3 | 4 | foreach ($Link in $Links) { 5 | 6 | if ($Link.href -match 'SysinternalsSuite.+zip$') { 7 | 8 | $LastModified = (Resolve-Uri -Uri $Link.href).LastModified 9 | $Version = @($LastModified.Year,$LastModified.Month,$LastModified.Day) -join '.' 10 | 11 | if ($Link.href -match 'SysinternalsSuite\.zip$') { 12 | New-NevergreenApp -Name 'Microsoft Sysinternals Suite' -Version $Version -Uri $Link.href -Type 'Zip' -Architecture 'Multi' -Platform 'Windows' 13 | } 14 | elseif ($Link.href -match 'SysinternalsSuite-Nano\.zip$') { 15 | New-NevergreenApp -Name 'Microsoft Sysinternals Suite' -Version $Version -Uri $Link.href -Type 'Zip' -Architecture 'x64' -Platform 'Nano Server' 16 | } 17 | elseif ($Link.href -match 'SysinternalsSuite-ARM64\.zip$') { 18 | New-NevergreenApp -Name 'Microsoft Sysinternals Suite' -Version $Version -Uri $Link.href -Type 'Zip' -Architecture 'ARM64' -Platform 'Windows' 19 | } 20 | 21 | } 22 | elseif ($Link.href -match 'pstools') { 23 | 24 | $DownloadPageURL = $Link.href | Set-UriPrefix -Prefix $BaseURL 25 | $URL = Get-Link -Uri $DownloadPageURL -MatchProperty href -Pattern '\.zip$' 26 | $LastModified = (Resolve-Uri -Uri $URL).LastModified 27 | $Version = @($LastModified.Year,$LastModified.Month,$LastModified.Day) -join '.' 28 | 29 | New-NevergreenApp -Name 'Microsoft Sysinternals PsTools Suite' -Version $Version -Uri $URL -Type 'Zip' -Architecture 'Multi' -Platform 'Windows' 30 | 31 | } 32 | elseif ($Link.outerHTML -match '(.+)') { 33 | 34 | $Name = "Microsoft Sysinternals $($Matches[2])" 35 | $DownloadPageURL = $Matches[1] | Set-UriPrefix -Prefix $BaseURL 36 | $URL = Get-Link -Uri $DownloadPageURL -MatchProperty href -Pattern '\.zip$' 37 | $Version = Get-Version -Uri $DownloadPageURL -Pattern ' v((?:\d+\.)+\d+)' 38 | 39 | New-NevergreenApp -Name $Name -Version $Version -Uri $URL -Type 'Zip' -Architecture 'Multi' -Platform 'Windows' 40 | 41 | } 42 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-MicrosoftWindowsADK.ps1: -------------------------------------------------------------------------------- 1 | $Links = (Invoke-WebRequest 'https://docs.microsoft.com/en-us/windows-hardware/get-started/adk-install' -DisableKeepAlive -UseBasicParsing).Links 2 | 3 | $URL = ($Links | Where-Object outerHTML -match "Download the Windows ADK" | Select-Object -ExpandProperty href -First 1 | Resolve-Uri).Uri 4 | if ($URL) { 5 | New-NevergreenApp -Name 'Microsoft Windows ADK for Windows 11' -Version '22H2' -Uri $URL -Architecture 'x86' -Type 'Exe' 6 | } 7 | 8 | $URL = ($Links | Where-Object outerHTML -match "ADK for Windows 11" | Select-Object -ExpandProperty href -First 1 | Resolve-Uri).Uri 9 | if ($URL) { 10 | New-NevergreenApp -Name 'Microsoft Windows ADK for Windows 11' -Version '21H2' -Uri $URL -Architecture 'x86' -Type 'Exe' 11 | } 12 | 13 | $Versions = @('1607','1703','1709','1803','1809','1903','1909','2004') 14 | 15 | foreach ($Version in $Versions) { 16 | $URL = ($Links | Where-Object outerHTML -match "ADK for Windows 10, version $Version" | Select-Object -ExpandProperty href -First 1 | Resolve-Uri).Uri 17 | if ($URL) { 18 | New-NevergreenApp -Name 'Microsoft Windows ADK for Windows 10' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Exe' 19 | } 20 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-MimecastForOutlook.ps1: -------------------------------------------------------------------------------- 1 | $Response = Invoke-WebRequest 'https://community.mimecast.com/s/mimecast-for-outlook' -UseBasicParsing -UserAgent 'Googlebot/2.1 (+http://www.google.com/bot.html)' 2 | 3 | $URL32 = ($Response.Links | Where-Object class -EQ 'cta-btn')[0].href.Replace('&','&') 4 | $URL64 = ($Response.Links | Where-Object class -EQ 'cta-btn')[1].href.Replace('&','&') 5 | 6 | $Version = $Response.Content | Get-Version -Pattern 'Build\s((?:\d+\.)+\d+)<' 7 | 8 | New-NevergreenApp -Name 'Mimecast for Outlook' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Zip' 9 | New-NevergreenApp -Name 'Mimecast for Outlook' -Version $Version -Uri $URL64 -Architecture 'x64' -Type 'Zip' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-Miniconda.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | $Response = Invoke-WebRequest -Uri 'https://docs.conda.io/projects/miniconda/en/latest/miniconda-other-installer-links.html' -UseBasicParsing -DisableKeepAlive 3 | 4 | $URIs = $Response.Links.href | Where-Object {$_ -like '*.exe'} 5 | 6 | foreach ($URI in $URIs) { 7 | if ($Response.Content -match "$URI[\s\S]+?(\w{64})") { 8 | $Hash = $matches[1] 9 | } 10 | else { 11 | $Hash = $null 12 | } 13 | 14 | if ($URI -like '*86.exe') { 15 | $Architecture = 'x86' 16 | } 17 | else { 18 | $Architecture = 'x64' 19 | } 20 | 21 | $Version = Get-Version -String $URI.Replace('-','.') 22 | $Platform = $URI -replace '.+py(\d)(\d+).+','Python $1.$2' 23 | 24 | New-NeverGreenApp -Name 'Miniconda' -Platform $Platform -Uri $URI -Version $Version -Architecture $Architecture -Type 'Exe' -SHA256 $Hash 25 | } 26 | } 27 | catch { 28 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 29 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-Nmap.ps1: -------------------------------------------------------------------------------- 1 | $URL = Get-Link -Uri 'https://nmap.org/download.html' -MatchProperty href -Pattern 'nmap-(?:\d+\.)+\d+-setup\.exe$' 2 | $Version = $URL | Get-Version 3 | 4 | New-NevergreenApp -Name 'Nmap' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-Npcap.ps1: -------------------------------------------------------------------------------- 1 | $URL = Get-Link -Uri 'https://nmap.org/npcap/' -MatchProperty href -Pattern 'npcap-(?:\d+\.)+\d+\.exe$' -PrefixParent 2 | 3 | $Version = $URL | Get-Version 4 | 5 | New-NevergreenApp -Name 'Npcap' -Version $Version -Uri $URL -Architecture 'Multi' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-OpenVPNCommunity.ps1: -------------------------------------------------------------------------------- 1 | $Version = Get-Version -Uri 'https://openvpn.net/community-downloads/' -Pattern 'OpenVPN ((?:\d+\.)+\d+\S*)' 2 | 3 | $Releases = @( 4 | @{Architecture = 'x86'; Type = 'Msi'; Pattern = 'x86\.msi$'} 5 | @{Architecture = 'x64'; Type = 'Msi'; Pattern = 'amd64\.msi$'} 6 | @{Architecture = 'ARM64'; Type = 'Msi'; Pattern = 'arm64\.msi$'} 7 | ) 8 | 9 | foreach ($Release in $Releases) { 10 | $URL = Get-Link -Uri 'https://openvpn.net/community-downloads/' -MatchProperty href -Pattern $Release.Pattern 11 | New-NevergreenApp -Name 'OpenVPNCommunity' -Version $Version -Uri $URL -Architecture $Release.Architecture -Type $Release.Type 12 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-OpenVPNConnect.ps1: -------------------------------------------------------------------------------- 1 | $Version = Get-Version -Uri 'https://openvpn.net/connect-docs/windows-release-notes.html' -Pattern '>((?:\d+\.)+\d+) \(\d+\)' 2 | 3 | $Releases = @( 4 | @{Architecture = 'x86'; Type = 'Msi'; Pattern = 'x86\.msi$'} 5 | @{Architecture = 'x64'; Type = 'Msi'; Pattern = 'windows\.msi$'} 6 | ) 7 | 8 | foreach ($Release in $Releases) { 9 | $URL = Get-Link -Uri 'https://openvpn.net/client/client-connect-vpn-for-windows/' -MatchProperty href -Pattern $Release.Pattern 10 | New-NevergreenApp -Name 'OpenVPNConnect' -Version $Version -Uri $URL -Architecture $Release.Architecture -Type $Release.Type 11 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-Opera.ps1: -------------------------------------------------------------------------------- 1 | $Architectures = @('x64','i386') 2 | 3 | foreach ($Architecture in $Architectures) { 4 | try { 5 | 6 | $Response = Invoke-WebRequest -Uri "https://download.opera.com/download/get/?partner=www&opsys=Windows&download_url=&arch=$Architecture" -UseBasicParsing 7 | 8 | if ($IsCoreCLR) { 9 | $Redirect = $Response.BaseResponse.RequestMessage.RequestUri.AbsoluteUri 10 | } 11 | else { 12 | $Redirect = $Response.BaseResponse.ResponseUri.AbsoluteUri 13 | } 14 | 15 | if ($Redirect -match 'id%3D(\d+)') { 16 | $URL = (Resolve-Uri -Uri "https://download.opera.com/download/get/?id=$($matches[1])¬hanks=yes").Uri 17 | $Version = $URL | Get-Version 18 | if ($Architecture -eq 'i386') { $Architecture = 'x86'} 19 | New-NevergreenApp -Name 'Opera' -Version $Version -Uri $URL -Architecture $Architecture -Type 'Exe' 20 | } 21 | 22 | } 23 | catch { 24 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 25 | } 26 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-PatchMyPC.ps1: -------------------------------------------------------------------------------- 1 | $Apps = @( 2 | @{Name = 'PatchMyPC Publisher'; Architecture = 'x64'; Type = 'Msi'; ReleasePage = 'https://docs.patchmypc.com/release-history/production-releases'; DownloadURL = 'https://api.patchmypc.com/downloads/publishingservice/PatchMyPC-Publishing-Service.msi' } 3 | @{Name = 'PatchMyPC Advanced Insights'; Architecture = 'x86'; Type = 'Exe'; ReleasePage = 'https://docs.patchmypc.com/release-history/advanced-insights-releases'; DownloadURL = 'https://api.patchmypc.com/downloads/exe/AdvancedInsights.exe' } 4 | @{Name = 'PatchMyPC ROI Tool'; Architecture = 'x86'; Type = 'Exe'; ReleasePage = 'https://docs.patchmypc.com/release-history/roi-tool-releases'; DownloadURL = 'https://api.patchmypc.com/downloads/exe/ReturnOnInvestmentTool.exe' } 5 | @{Name = 'PatchMyPC MEM Patching Optimizer'; Architecture = 'x86'; Type = 'Exe'; ReleasePage = 'https://github.com/PatchMyPCTeam/MEM-Patching-Optimizer/releases/latest'; DownloadURL = $null } 6 | ) 7 | 8 | foreach ($App in $Apps) { 9 | try { 10 | if ($App.ReleasePage -match '^https://github.com') { 11 | $Response = Invoke-RestMethod -Uri $App.ReleasePage.Replace('https://github.com/','https://api.github.com/repos/') -ContentType 'application/vnd.github.v3+json' -DisableKeepAlive -UseBasicParsing 12 | $Version = $Response.tag_name | Get-Version 13 | $DownloadURL = $Response.assets.browser_download_url | Where-Object {$_ -like '*Optimizer.exe'} 14 | New-NevergreenApp -Name $App.Name -Version $Version -Uri $DownloadURL -Architecture $App.Architecture -Type $App.Type 15 | } 16 | else { 17 | $Version = Get-Link -Uri $App.ReleasePage -MatchProperty 'aria-label' -Pattern 'Direct link to heading' -ReturnProperty 'href' -ErrorAction Stop | Get-Version 18 | New-NevergreenApp -Name $App.Name -Version $Version -Uri $App.DownloadURL -Architecture $App.Architecture -Type $App.Type 19 | } 20 | } 21 | catch { 22 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 23 | } 24 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-PhilippeJouninTftpd64.ps1: -------------------------------------------------------------------------------- 1 | $URL32 = Get-Link -Uri 'https://bitbucket.org/phjounin/tftpd64/wiki/Download%20Tftpd64' -MatchProperty href -Pattern 'tftpd32-.+-setup\.exe' 2 | $URL64 = Get-Link -Uri 'https://bitbucket.org/phjounin/tftpd64/wiki/Download%20Tftpd64' -MatchProperty href -Pattern 'tftpd64-.+-setup\.exe' 3 | $Version32 = $URL32 | Get-Version 4 | $Version64 = $URL64 | Get-Version 5 | 6 | New-NevergreenApp -Name 'Philippe Jounin Tftpd64' -Version $Version32 -Uri $URL32 -Architecture 'x86' -Type 'Exe' 7 | New-NevergreenApp -Name 'Philippe Jounin Tftpd64' -Version $Version64 -Uri $URL64 -Architecture 'x64' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-PingIdentityPingID.ps1: -------------------------------------------------------------------------------- 1 | $Response = Invoke-RestMethod 'https://docs.pingidentity.com/api/khub/maps/v6hqiVhowIDI52XNglkuRw/pages' -DisableKeepAlive 2 | $Version = (($Response.paginatedToc | Where-Object title -eq 'Release Notes').children | Where-Object title -eq 'PingID desktop app release notes').children[0].title | Get-Version 3 | 4 | $URL = Get-Link -Uri 'https://www.pingidentity.com/en/resources/downloads/pingid.html' -MatchProperty outerHTML -Pattern 'download for windows' 5 | 6 | New-NevergreenApp -Name 'PingID' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-Python.ps1: -------------------------------------------------------------------------------- 1 | $SupportedVersions = @('3.10','3.11') 2 | 3 | $Suffixes = @{x86 = '.exe'; x64 = '-amd64.exe'; ARM64 = '-arm64.exe'} 4 | 5 | foreach ($SupportedVersion in $SupportedVersions) { 6 | 7 | foreach ($Platform in $Suffixes.keys) { 8 | 9 | $URL = Get-Link -Uri 'https://www.python.org/downloads/windows/' -MatchProperty href -Pattern "python-($([RegEx]::Escape($SupportedVersion))\.\d+)$([RegEx]::Escape($Suffixes[$Platform]))$" 10 | if ($URL) { 11 | $Version = $URL | Get-Version 12 | New-NevergreenApp -Name "Python $SupportedVersion" -Version $Version -Uri $URL -Architecture $Platform -Type 'Exe' 13 | } 14 | } 15 | 16 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-QGIS.ps1: -------------------------------------------------------------------------------- 1 | $Response = Invoke-WebRequest -Uri 'https://www.qgis.org/download/' -DisableKeepAlive -UseBasicParsing 2 | 3 | $URL64 = 'https://www.qgis.org' + ($Response.Links | Where-Object {$_.outerHTML -match 'Long Term' -and $_.href -Like '*.msi'} | Select-Object -First 1 -ExpandProperty href) 4 | $Version64 = $URL64 | Get-Version 5 | 6 | $URL64LTR = 'https://www.qgis.org' + ($Response.Links | Where-Object {$_.outerHTML -match 'Latest' -and $_.href -Like '*.msi'} | Select-Object -First 1 -ExpandProperty href) 7 | $Version64LTR = $URL64LTR | Get-Version 8 | 9 | New-NevergreenApp -Name 'QGIS' -Version $Version64 -Uri $URL64 -Architecture 'x64' -Channel 'Latest' -Type 'Msi' 10 | New-NevergreenApp -Name 'QGIS' -Version $Version64LTR -Uri $URL64LTR -Architecture 'x64' -Channel 'LTR' -Type 'Msi' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-RIAeID.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $URL = Get-Link -Uri 'https://www.id.ee/en/article/install-id-software/' -MatchProperty href -Pattern '\.exe$' 4 | $Version = $URL | Get-Version 5 | 6 | New-NevergreenApp -Name 'RIA eID' -Version $Version -Uri $URL -Architecture 'Multi' -Type 'Exe' 7 | 8 | } 9 | catch { 10 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 11 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-RadioDetectionCatManager.ps1: -------------------------------------------------------------------------------- 1 | $Version = Get-Version -Uri 'https://www.radiodetection.com/en-gb/resources/software-downloads/cat4-manager' -Pattern 'Version: ((?:\d+\.)+\d+)' 2 | 3 | $URL32 = Get-Link -Uri 'https://www.radiodetection.com/en-gb/resources/software-downloads/cat4-manager' -MatchProperty href -Pattern '\.zip' 4 | 5 | New-NevergreenApp -Name 'Radio Detection CAT Manager' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Zip' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-RedstorBackupProStoragePlatformConsole.ps1: -------------------------------------------------------------------------------- 1 | $UserAgents = @( 2 | $Null 3 | # User agent from [Microsoft.PowerShell.Commands.PSUserAgent]::Chrome in PowerShell 7 4 | 'Mozilla/5.0 (Windows NT 10.0; Microsoft Windows 10.0.22631; en-GB) AppleWebKit/534.6 (KHTML, like Gecko) Chrome/7.0.500.0 Safari/534.6' 5 | ) 6 | $DownloadPageURL = $Null 7 | 8 | foreach ($UserAgent in $UserAgents) { 9 | $GetLinkExtraParams = @{} 10 | if ($UserAgent) { 11 | $GetLinkExtraParams['UserAgent'] = $UserAgent 12 | } 13 | try { 14 | $DownloadPageURL = Get-Link ` 15 | @GetLinkExtraParams ` 16 | -Uri 'https://support.redstor.com/hc/en-gb/sections/200458081-Downloads' ` 17 | -MatchProperty href ` 18 | -Pattern 'Latest-downloads' ` 19 | -PrefixDomain ` 20 | -ErrorAction Stop 21 | } catch { 22 | continue 23 | } 24 | break 25 | } 26 | 27 | if (-not $DownloadPageURL) { 28 | Write-Error 'Could not connect to Redstor download page.' 29 | return 30 | } 31 | 32 | $URL32 = Get-Link ` 33 | @GetLinkExtraParams ` 34 | -Uri $DownloadPageURL ` 35 | -MatchProperty href ` 36 | -Pattern 'RedstorBackupPro-SP-Console' 37 | 38 | $Version = $URL32 | Get-Version -Pattern '((?:\d+\.)+\d+)\.exe$' 39 | 40 | New-NevergreenApp -Name 'Redstor Backup Pro Storage Platform Console' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-TMurgentAppVDefConGroups.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $URL = (Get-Link -Uri 'https://www.tmurgent.com/APPV/en/resources/tools-downloads/tools-downloads-appv5/89-tools/app-v-5-tools/159-appv-defcongroups' -MatchProperty href -Pattern '\.zip$' -PrefixDomain | Resolve-Uri).Uri 4 | 5 | $Version = Get-Version -Uri 'https://www.tmurgent.com/APPV/en/resources/tools-downloads/tools-downloads-appv5/89-tools/app-v-5-tools/159-appv-defcongroups' -Pattern '((?:\d+\.)+\d+)' 6 | 7 | New-NevergreenApp -Name 'TMurgent AppVDefConGroups' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Zip' 8 | 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-TMurgentAppVManage.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $URL = (Get-Link -Uri 'https://www.tmurgent.com/APPV/en/resources/AppV_Manage/221-appv-manage-introduction' -MatchProperty href -Pattern '\.zip$' -PrefixDomain | Resolve-Uri).Uri 4 | 5 | $Version = $URL | Get-Version 6 | 7 | New-NevergreenApp -Name 'TMurgent AppVManage' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Zip' 8 | 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-TMurgentAppVManifestEditor.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $URL = (Get-Link -Uri 'https://www.tmurgent.com/APPV/en/resources/AVME/349-avme-introduction' -MatchProperty href -Pattern '\.zip$' -PrefixDomain | Resolve-Uri).Uri 4 | 5 | $Version = $URL | Get-Version 6 | 7 | New-NevergreenApp -Name 'TMurgent AppVManifestEditor' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Zip' 8 | 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-TMurgentPsfTooling.ps1: -------------------------------------------------------------------------------- 1 | # MSIX links on site out of date 2 | try { 3 | 4 | $URL = Get-Link -Uri 'https://www.tmurgent.com/APPV/en/resources/tools-downloads/msix-tools/128-msix-tools/557-psftoolingv48' -MatchProperty href -Pattern '\.msix$' -PrefixDomain -ErrorAction Stop 5 | 6 | $Version = $URL | Get-Version 7 | 8 | New-NevergreenApp -Name 'TMurgent PsfTooling' -Version $Version -Uri $URL -Architecture 'x86' -Type 'MSIX' 9 | 10 | } 11 | catch { 12 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 13 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-TMurgentPullApps.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $URL = (Get-Link -Uri 'https://www.tmurgent.com/APPV/en/resources/tools-downloads/msix-tools/127-pullapps/511-pullapps-installation' -MatchProperty href -Pattern '\.zip$' -PrefixDomain | Resolve-Uri).Uri 4 | 5 | $Version = $URL | Get-Version 6 | 7 | New-NevergreenApp -Name 'TMurgent PullApps' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Zip' 8 | 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-TMurgentTMEdit.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $URL = (Get-Link -Uri 'https://www.tmurgent.com/APPV/en/buy/tmedit/tmedit-download' -MatchProperty href -Pattern '\.zip$' -PrefixDomain | Resolve-Uri).Uri 4 | 5 | $Version = $URL | Get-Version 6 | 7 | New-NevergreenApp -Name 'TMurgent TMEdit' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Zip' 8 | 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-TMurgentTMEditX.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $URL = (Get-Link -Uri 'https://www.tmurgent.com/APPV/en/buy/tmeditx/tmeditx-download' -MatchProperty href -Pattern '\.msix$' -PrefixDomain | Resolve-Uri).Uri 4 | 5 | $Version = $URL | Get-Version 6 | 7 | New-NevergreenApp -Name 'TMurgent TMEditX' -Version $Version -Uri $URL -Architecture 'x86' -Type 'MSIX' 8 | 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | } -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-ZebraCardStudio.ps1: -------------------------------------------------------------------------------- 1 | $URL32 = (Resolve-Uri -Uri 'https://cardstudio.zebra.com/download').Uri 2 | 3 | $Version = $URL32 | Get-Version 4 | 5 | New-NevergreenApp -Name 'Zebra Card Studio' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Apps/Get-Zoom.ps1: -------------------------------------------------------------------------------- 1 | $VDILinks = (Invoke-WebRequest -Uri 'https://support.zoom.us/hc/en-us/articles/4415057249549' -UseBasicParsing -UserAgent 'Googlebot/2.1 (+http://www.google.com/bot.html)').Links 2 | 3 | $Apps = @( 4 | @{Name = 'Zoom VDI Client'; Architecture = 'x86'; Type = 'Msi'; Pattern = 'ZoomInstallerVDI.+?msi$' } 5 | @{Name = 'Zoom VDI Client'; Architecture = 'x64'; Type = 'Msi'; Pattern = 'ZoomInstallerVDI.+?msi\?archType.+x64$' } 6 | @{Name = 'Zoom Citrix Plugin'; Architecture = 'x86'; Type = 'Msi'; Pattern = 'ZoomCitrixHDXMediaPlugin\.msi$' } 7 | @{Name = 'Zoom VDI Universal Plugin'; Architecture = 'x86'; Type = 'Msi'; Pattern = 'ZoomVDIUniversalPlugin.+?msi$' } 8 | @{Name = 'Zoom VDI Universal Plugin'; Architecture = 'x64'; Type = 'Msi'; Pattern = 'ZoomVDIUniversalPlugin.+?msi\?archType.+x64$' } 9 | ) 10 | 11 | foreach ($App in $Apps) { 12 | $URL = $VDILinks | Where-Object href -Match $App.Pattern | Select-Object -ExpandProperty href -First 1 13 | $Version = $URL | Get-Version 14 | 15 | if ($URL -and $Version) { 16 | New-NevergreenApp -Name $App.Name -Version $Version -Uri $URL -Architecture $App.Architecture -Type $App.Type 17 | } 18 | else { 19 | Write-Warning -Message "Unable to retrieve details for $($App.Name) $($App.Architecture) $($App.Type)" 20 | } 21 | } -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-AdoptOpenJDK.ps1: -------------------------------------------------------------------------------- 1 | $MajorVersions = @(8,11,16) 2 | $JvmTypes = @('HotSpot', 'OpenJ9') 3 | $HeapSizes = @('Normal', 'Large') 4 | $ImageTypes = @('JDK', 'JRE') 5 | $Architectures = @('x32','x64') 6 | 7 | foreach ($MajorVersion in $MajorVersions) { 8 | foreach ($JvmType in $JvmTypes) { 9 | 10 | $ReleasesURL = "https://api.adoptopenjdk.net/v3/assets/latest/$MajorVersion/$($JvmType.ToLower())?release=latest&jvm_impl=$($JvmType.ToLower())&vendor=adoptopenjdk&" 11 | 12 | try { 13 | 14 | $Releases = Invoke-RestMethod -Uri $ReleasesURL -DisableKeepAlive -ErrorAction Stop 15 | 16 | foreach ($HeapSize in $HeapSizes) { 17 | foreach ($ImageType in $ImageTypes) { 18 | foreach ($Architecture in $Architectures) { 19 | 20 | $Release = $Releases | Where-Object { $_.binary.os -eq 'windows' -and $_.binary.heap_size -eq $HeapSize -and $_.binary.image_type -eq $ImageType -and $_.binary.architecture -eq $Architecture } 21 | 22 | if ($Release) { 23 | if ($Release.Count -gt 1) { 24 | Write-Warning "Unexpected multiple releases returned for AdoptOpenJDK $MajorVersion $JvmType $HeapSize $ImageType $Architecture" 25 | } 26 | 27 | if ($Architecture -eq 'x32') { 28 | $Architecture = 'x86' 29 | } 30 | 31 | $Release | ForEach-Object { 32 | $Version = ($_.version.openjdk_version.Replace('_','.').Replace('+','.') -Replace '-[a-z]','.') -Replace '^1\.8\.','8.' 33 | New-NevergreenApp -Name "AdoptOpenJDK$MajorVersion" -Version $Version -Uri $_.binary.installer.link -Platform "$JvmType $HeapSize $ImageType" -Architecture $Architecture -Type 'Msi' 34 | New-NevergreenApp -Name "AdoptOpenJDK$MajorVersion" -Version $Version -Uri $_.binary.package.link -Platform "$JvmType $HeapSize $ImageType" -Architecture $Architecture -Type 'Zip' 35 | } 36 | } 37 | 38 | } 39 | } 40 | } 41 | } 42 | catch { 43 | Write-Error "$($MyInvocation.MyCommand): Error querying REST API $($ReleasesURL): $($_.Exception.Message)" 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-AppVentix.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $URL = Get-Link -Uri 'https://appventix.com/thank-you/' -MatchProperty outerHTML -Pattern 'Download AppVentix' 4 | 5 | $Version = (Resolve-Uri -Uri $URL).FileName | Get-Version 6 | 7 | New-NevergreenApp -Name 'AppVentix' -Version $Version -Uri $URL -Architecture 'x64' -Type 'Zip' 8 | 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | } -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-Audacity.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $URL = Get-Link -Uri 'https://www.audacityteam.org/download/windows/' -MatchProperty href -Pattern '\.exe$' 4 | 5 | $Version = $URL | Get-Version 6 | 7 | New-NevergreenApp -Name 'Audacity' -Version $Version -Uri $URL -Architecture 'x86' -Type 'Exe' 8 | 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | } -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-FreedomScientificFusion.ps1: -------------------------------------------------------------------------------- 1 | $MajorVersion = 13 2 | 3 | do { 4 | try { 5 | 6 | $Releases = Invoke-RestMethod -Uri "https://support.freedomscientific.com/Downloads/OfflineInstallers/GetInstallers?product=Fusion&version=$MajorVersion&language=mul&releaseType=Offline" -DisableKeepAlive 7 | 8 | foreach ($Release in $Releases) { 9 | 10 | $Version = $Release.FileName | Get-Version 11 | $Type = (Get-Culture).TextInfo.ToTitleCase([System.IO.Path]::GetExtension($Release.InstallerLocationHTTP).Replace('.','')) 12 | New-NevergreenApp -Name 'Fusion' -Version $Version -Uri $Release.InstallerLocationHTTP -Architecture 'Multi' -Type $Type 13 | 14 | } 15 | 16 | } 17 | catch { 18 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 19 | } 20 | 21 | $MajorVersion++ 22 | 23 | } 24 | until ($MajorVersion -ge ([int](Get-Date -Format 'yy') - 6) -and $Releases.Count -eq 0) -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-FreedomScientificJAWS.ps1: -------------------------------------------------------------------------------- 1 | $MajorVersion = 20 2 | 3 | do { 4 | try { 5 | 6 | $Releases = Invoke-RestMethod -Uri "https://support.freedomscientific.com/Downloads/OfflineInstallers/GetInstallers?product=JAWS&version=$MajorVersion&language=mul&releaseType=Offline" -DisableKeepAlive 7 | 8 | foreach ($Release in $Releases) { 9 | 10 | if ($Release.InstallerPlatform -eq '32-bit') { 11 | $Architecture = 'x86' 12 | } 13 | elseif ($Release.InstallerPlatform -eq '64-bit') { 14 | $Architecture = 'x64' 15 | } 16 | else{ 17 | Write-Warning "Unrecognised platform: $($Release.InstallerPlatform)" 18 | break 19 | } 20 | 21 | $Version = $Release.FileName | Get-Version 22 | $Type = (Get-Culture).TextInfo.ToTitleCase([System.IO.Path]::GetExtension($Release.InstallerLocationHTTP).Replace('.','')) 23 | New-NevergreenApp -Name 'JAWS' -Version $Version -Uri $Release.InstallerLocationHTTP -Architecture $Architecture -Type $Type 24 | } 25 | 26 | } 27 | catch { 28 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 29 | } 30 | 31 | $MajorVersion++ 32 | 33 | } 34 | until ($MajorVersion -ge ([int](Get-Date -Format 'yy') + 1) -and $Releases.Count -eq 0) -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-FreedomScientificZoomText.ps1: -------------------------------------------------------------------------------- 1 | $MajorVersion = 12 2 | 3 | do { 4 | try { 5 | 6 | $Releases = Invoke-RestMethod -Uri "https://support.freedomscientific.com/Downloads/OfflineInstallers/GetInstallers?product=ZoomText&version=$MajorVersion&language=enu&releaseType=Offline" -DisableKeepAlive 7 | 8 | foreach ($Release in $Releases) { 9 | 10 | $Version = $Release.FileName | Get-Version 11 | $Type = (Get-Culture).TextInfo.ToTitleCase([System.IO.Path]::GetExtension($Release.InstallerLocationHTTP).Replace('.','')) 12 | New-NevergreenApp -Name 'ZoomText' -Version $Version -Uri $Release.InstallerLocationHTTP -Architecture 'Multi' -Type $Type 13 | 14 | } 15 | 16 | } 17 | catch { 18 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 19 | } 20 | 21 | $MajorVersion++ 22 | 23 | } 24 | until ($MajorVersion -ge ([int](Get-Date -Format 'yy') - 6) -and $Releases.Count -eq 0) -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-MasterPackager.ps1: -------------------------------------------------------------------------------- 1 | $URL32 = Get-Link -Uri 'https://www.masterpackager.com/pricing' -MatchProperty href -Pattern '\.msi$' -PrefixDomain 2 | 3 | try { 4 | $Version = Get-Version -Uri 'https://www.masterpackager.com/uploads/file_archive/version.txt' -ErrorAction Stop 5 | } 6 | catch { 7 | $Version = $URL32 | Get-Version 8 | } 9 | 10 | New-NevergreenApp -Name 'Master Packager' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Msi' -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-MicrosoftAzureInformationProtection.ps1: -------------------------------------------------------------------------------- 1 | $Version = Get-Version -Uri 'https://docs.microsoft.com/en-us/azure/information-protection/rms-client/unifiedlabelingclient-version-release-history' -Pattern '>Version\s((?:\d+\.)+\d+)' 2 | $URLMsi = Get-Link -Uri 'https://www.microsoft.com/en-us/download/confirmation.aspx?id=53018' -MatchProperty href -Pattern '_UL\.msi' 3 | $URLExe = Get-Link -Uri 'https://www.microsoft.com/en-us/download/confirmation.aspx?id=53018' -MatchProperty href -Pattern '_UL\.exe' 4 | 5 | New-NevergreenApp -Name 'Microsoft Azure Information Protection' -Version $Version -Uri $URLMsi -Architecture 'x86' -Type 'MSI' 6 | New-NevergreenApp -Name 'Microsoft Azure Information Protection' -Version $Version -Uri $URLExe -Architecture 'x86' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-MicrosoftRemoteDesktop.ps1: -------------------------------------------------------------------------------- 1 | $URL64 = 'https://go.microsoft.com/fwlink/?linkid=2068602' 2 | $URL32 = 'https://go.microsoft.com/fwlink/?linkid=2098960' 3 | $URLARM64 = 'https://go.microsoft.com/fwlink/?linkid=2098961' 4 | 5 | $Version = (Resolve-Uri -Uri $URL64).FileName | Get-Version 6 | 7 | New-NevergreenApp -Name 'Microsoft Remote Desktop' -Version $Version -Uri $URL32 -Architecture 'x86' 8 | New-NevergreenApp -Name 'Microsoft Remote Desktop' -Version $Version -Uri $URL64 -Architecture 'x64' 9 | New-NevergreenApp -Name 'Microsoft Remote Desktop' -Version $Version -Uri $URLARM64 -Architecture 'ARM64' -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-MicrosoftTeams.ps1: -------------------------------------------------------------------------------- 1 | $DownloadURL = 'https://raw.githubusercontent.com/ItzLevvie/MicrosoftTeams-msinternal/master/defconfig' 2 | $DownloadText = (Invoke-WebRequest -Uri $DownloadURL -DisableKeepAlive -UseBasicParsing).Content 3 | 4 | $Rings = @('Daily', 'Experimental', 'Preview', 'Production') 5 | $Architectures = @('x64', 'x86', 'ARM64') 6 | $Types = @('Exe', 'MSI') 7 | 8 | foreach ($Ring in $Rings) { 9 | foreach ($Architecture in $Architectures) { 10 | foreach ($Type in $Types) { 11 | 12 | $RegEx = "$Ring (?:.+\n)+((?:\d+\.)+\d+).+win-$Architecture.+(http.+\.$Type)" 13 | 14 | if ($DownloadText -match $RegEx) { 15 | New-NevergreenApp -Name 'Microsoft Teams' -Version $matches[1] -Uri $matches[2] -Architecture $Architecture -Type $Type -Ring $Ring 16 | } 17 | else { 18 | Write-Warning "No match found for Microsoft Teams $Channel $Architecture $Type" 19 | } 20 | 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-RStudio.ps1: -------------------------------------------------------------------------------- 1 | try { 2 | 3 | $URL = Get-Link -Uri 'https://www.rstudio.com/products/rstudio/download/' -MatchProperty href -Pattern '\.exe$' 4 | 5 | $Version = $URL | Get-Version 6 | 7 | New-NevergreenApp -Name 'RStudio' -Version $Version -Uri $URL -Architecture 'x64' -Type 'Exe' 8 | 9 | } 10 | catch { 11 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 12 | } -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-RizonesoftNotepad3.ps1: -------------------------------------------------------------------------------- 1 | $Releases = @( 2 | @{Architecture = 'x64'; Type = 'exe'; Pattern = 'Notepad3_((?:\d+\.)+\d+)_x64_Setup\.exe' } 3 | @{Architecture = 'x86'; Type = 'exe'; Pattern = 'Notepad3_((?:\d+\.)+\d+)_x86_Setup\.exe' } 4 | ) 5 | 6 | foreach ($Release in $Releases) { 7 | try { 8 | $URL = Get-Link -Uri 'https://www.rizonesoft.com/downloads/notepad3/' -MatchProperty outerHTML -Pattern $Release.Pattern -ReturnProperty href -ErrorAction Stop 9 | $Version = Get-Version -Uri 'https://www.rizonesoft.com/downloads/notepad3/' -Pattern $Release.Pattern -ErrorAction Stop 10 | New-NevergreenApp -Name 'Notepad3' -Version $Version -Uri $URL -Architecture $Release.Architecture -Type $Release.Type 11 | } 12 | catch { 13 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 14 | } 15 | } -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-SimonTathamPuTTY.ps1: -------------------------------------------------------------------------------- 1 | $Version = Get-Version -Uri 'https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html' -Pattern 'latest\srelease\s\(((?:\d+\.)+\d+)\)' 2 | 3 | $URL64,$URLARM64,$URL32,$URLARM32 = Get-Link -Uri 'https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html' -MatchProperty href -Pattern 'putty-64bit.+\.msi','putty-arm64.+\.msi','putty-\d+\.\d+.+\.msi','putty-arm32.+\.msi' 4 | 5 | New-NevergreenApp -Name 'Simon Tatham PuTTY' -Version $Version -Uri $URL64 -Architecture 'x64' -Type 'Msi' 6 | New-NevergreenApp -Name 'Simon Tatham PuTTY' -Version $Version -Uri $URLARM64 -Architecture 'ARM64' -Type 'Msi' 7 | New-NevergreenApp -Name 'Simon Tatham PuTTY' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Msi' 8 | New-NevergreenApp -Name 'Simon Tatham PuTTY' -Version $Version -Uri $URLARM32 -Architecture 'ARM32' -Type 'Msi' -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-TableauDesktop.ps1: -------------------------------------------------------------------------------- 1 | $URL64 = (Resolve-Uri -Uri 'https://www.tableau.com/downloads/desktop/pc64').Uri 2 | $Version = $URL64 | Get-Version -Pattern '((?:\d+-)+\d+)\.exe$' -ReplaceWithDot 3 | 4 | New-NevergreenApp -Name 'Tableau Desktop' -Version $Version -Uri $URL64 -Architecture 'x64' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-TableauReader.ps1: -------------------------------------------------------------------------------- 1 | $URL64 = (Resolve-Uri -Uri 'https://www.tableau.com/downloads/reader/pc64').Uri 2 | $Version = $URL64 | Get-Version -Pattern '((?:\d+-)+\d+)\.exe$' -ReplaceWithDot 3 | 4 | New-NevergreenApp -Name 'Tableau Reader' -Version $Version -Uri $URL64 -Architecture 'x64' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Deprecated/Get-USBPcap.ps1: -------------------------------------------------------------------------------- 1 | #URL not absolute. Exists on Github so submit to Evergreen instead. 2 | 3 | $URL = Get-Link -Uri 'https://desowin.org/usbpcap/' -MatchProperty href -Pattern 'USBPcapSetup-(?:\d+\.)+\d+\.exe$' -PrefixParent 4 | 5 | $Version = $URL | Get-Version 6 | 7 | New-NevergreenApp -Name 'USBPcap' -Version $Version -Uri $URL -Architecture 'Multi' -Type 'Exe' -------------------------------------------------------------------------------- /Nevergreen/Nevergreen.psd1: -------------------------------------------------------------------------------- 1 | # Module manifest for module 'Nevergreen' 2 | # Generated by: Dan Gough 3 | # Last updated: 18/08/2024 4 | 5 | @{ 6 | 7 | # Script module or binary module file associated with this manifest. 8 | RootModule = 'Nevergreen.psm1' 9 | 10 | # Version number of this module. 11 | ModuleVersion = '2408.1' 12 | 13 | # Supported PSEditions 14 | CompatiblePSEditions = @('Desktop', 'Core') 15 | 16 | # ID used to uniquely identify this module 17 | GUID = '499e0a34-0e61-493d-9818-7507317e7536' 18 | 19 | # Author of this module 20 | Author = 'Dan Gough' 21 | 22 | # Company or vendor of this module 23 | CompanyName = 'Dan Gough' 24 | 25 | # Copyright statement for this module 26 | Copyright = '(c) Dan Gough. All rights reserved.' 27 | 28 | # Description of the functionality provided by this module 29 | Description = 'This module is an alternative to Evergreen, and allows you to find the latest version and download URL for various Windows apps. Evergreen uses API queries to obtain its data whereas this module is more focussed on web scraping. This is more prone to breaking when websites are changed, hence the name!' 30 | 31 | # Minimum version of the PowerShell engine required by this module 32 | PowerShellVersion = '5.1' 33 | 34 | # Name of the PowerShell host required by this module 35 | # PowerShellHostName = '' 36 | 37 | # Minimum version of the PowerShell host required by this module 38 | # PowerShellHostVersion = '' 39 | 40 | # Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. 41 | # DotNetFrameworkVersion = '' 42 | 43 | # Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. 44 | # ClrVersion = '' 45 | 46 | # Processor architecture (None, X86, Amd64) required by this module 47 | # ProcessorArchitecture = '' 48 | 49 | # Modules that must be imported into the global environment prior to importing this module 50 | # RequiredModules = @() 51 | 52 | # Assemblies that must be loaded prior to importing this module 53 | # RequiredAssemblies = @() 54 | 55 | # Script files (.ps1) that are run in the caller's environment prior to importing this module. 56 | # ScriptsToProcess = @() 57 | 58 | # Type files (.ps1xml) to be loaded when importing this module 59 | # TypesToProcess = @() 60 | 61 | # Format files (.ps1xml) to be loaded when importing this module 62 | # FormatsToProcess = @() 63 | 64 | # Modules to import as nested modules of the module specified in RootModule/ModuleToProcess 65 | # NestedModules = @() 66 | 67 | # Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. 68 | FunctionsToExport = @('Find-NevergreenApp', 'Get-NevergreenApp') 69 | 70 | # Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. 71 | CmdletsToExport = @() 72 | 73 | # Variables to export from this module 74 | VariablesToExport = @() 75 | 76 | # Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. 77 | AliasesToExport = @() 78 | 79 | # DSC resources to export from this module 80 | DscResourcesToExport = @() 81 | 82 | # List of all modules packaged with this module 83 | # ModuleList = @() 84 | 85 | # List of all files packaged with this module 86 | # FileList = @() 87 | 88 | # Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. 89 | PrivateData = @{ 90 | 91 | PSData = @{ 92 | 93 | # Tags applied to this module. These help with module discovery in online galleries. 94 | Tags = @('Evergreen') 95 | 96 | # A URL to the license for this module. 97 | LicenseUri = 'https://github.com/DanGough/Nevergreen/blob/main/LICENSE' 98 | 99 | # A URL to the main website for this project. 100 | ProjectUri = 'https://github.com/DanGough/Nevergreen' 101 | 102 | # A URL to an icon representing this module. 103 | # IconUri = '' 104 | 105 | # ReleaseNotes of this module 106 | ReleaseNotes = 'https://github.com/DanGough/Nevergreen/releases' 107 | 108 | # Prerelease string of this module 109 | # Prerelease = '' 110 | 111 | # Flag to indicate whether the module requires explicit user acceptance for install/update/save 112 | # RequireLicenseAcceptance = $false 113 | 114 | # External dependent modules of this module 115 | # ExternalModuleDependencies = @() 116 | 117 | } # End of PSData hashtable 118 | 119 | } # End of PrivateData hashtable 120 | 121 | # HelpInfo URI of this module 122 | # HelpInfoURI = '' 123 | 124 | # Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. 125 | # DefaultCommandPrefix = '' 126 | 127 | } 128 | -------------------------------------------------------------------------------- /Nevergreen/Nevergreen.psm1: -------------------------------------------------------------------------------- 1 | $Public = @(Get-ChildItem -Path ([System.IO.Path]::Combine($PSScriptRoot, 'Public', '*.ps1'))) 2 | $Private = @(Get-ChildItem -Path ([System.IO.Path]::Combine($PSScriptRoot, 'Private', '*.ps1')) -ErrorAction Ignore) 3 | 4 | ForEach ($Import in @($Public + $Private)) { 5 | Try { 6 | . $Import.FullName 7 | } 8 | Catch { 9 | Write-Error -Message "Failed to import function $($Import.FullName): $_" 10 | } 11 | } 12 | 13 | Export-ModuleMember -Function $Public.Basename 14 | 15 | Register-ArgumentCompleter -CommandName 'Get-NevergreenApp', 'Find-NevergreenApp' -ParameterName 'Name' -ScriptBlock { 16 | param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters) 17 | 18 | $Apps = Get-ChildItem -Path ([System.IO.Path]::Combine($PSScriptRoot, 'Apps', '*.ps1')) 19 | $Apps.BaseName -replace '^Get-' | Where-Object { 20 | $_ -like "$wordToComplete*" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Nevergreen/Private/Get-Link.ps1: -------------------------------------------------------------------------------- 1 | function Get-Link { 2 | <# 3 | .SYNOPSIS 4 | Returns a specific link from a web page. 5 | 6 | .DESCRIPTION 7 | Returns a specific link from a web page. 8 | 9 | .NOTES 10 | Site: https://packageology.com 11 | Author: Dan Gough 12 | Twitter: @packageologist 13 | 14 | .LINK 15 | https://github.com/DanGough/Nevergreen 16 | 17 | .PARAMETER Uri 18 | The URI to query. 19 | 20 | .PARAMETER MatchProperty 21 | Which property the RegEx pattern should be applied to, e.g. href, outerHTML, class, title. 22 | 23 | .PARAMETER Pattern 24 | The RegEx pattern to apply to the selected property. Supply an array of patterns to receive multiple links. 25 | 26 | .PARAMETER ReturnProperty 27 | Optional. Specifies which property to return from the link. Defaults to href, but 'data-filename' can also be useful to retrieve. 28 | 29 | .PARAMETER UserAgent 30 | Optional parameter to provide a user agent for Invoke-WebRequest to use. Examples are: 31 | 32 | Googlebot: 'Googlebot/2.1 (+http://www.google.com/bot.html)' 33 | Microsoft Edge: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246' 34 | 35 | .EXAMPLE 36 | Get-Link -Uri 'http://somewhere.com' -MatchProperty href -Pattern '\.exe$' 37 | 38 | Description: 39 | Returns first download link matching *.exe from http://somewhere.com. 40 | #> 41 | [CmdletBinding(SupportsShouldProcess = $False)] 42 | param ( 43 | [Parameter( 44 | Mandatory = $true, 45 | Position = 0, 46 | ValueFromPipeline)] 47 | [ValidatePattern('^(http|https)://')] 48 | [Alias('Url')] 49 | [String] $Uri, 50 | [Parameter( 51 | Mandatory = $true, 52 | Position = 1)] 53 | [ValidateNotNullOrEmpty()] 54 | #[ValidateSet('href', 'outerHTML', 'innerHTML', 'outerText', 'innerText', 'class', 'title', 'tagName', 'data-filename')] 55 | [String] $MatchProperty, 56 | [Parameter( 57 | Mandatory = $true, 58 | Position = 2)] 59 | [ValidateNotNullOrEmpty()] 60 | [String[]] $Pattern, 61 | [Parameter( 62 | Mandatory = $false, 63 | Position = 3)] 64 | [ValidateNotNullOrEmpty()] 65 | [String] $ReturnProperty = 'href', 66 | [Parameter( 67 | Mandatory = $false)] 68 | [String] $UserAgent, 69 | [System.Collections.Hashtable] $Headers, 70 | [Switch] $PrefixDomain, 71 | [Switch] $PrefixParent 72 | ) 73 | 74 | $ProgressPreference = 'SilentlyContinue' 75 | 76 | $ParamHash = @{ 77 | Uri = $Uri 78 | Method = 'GET' 79 | UseBasicParsing = $True 80 | DisableKeepAlive = $True 81 | ErrorAction = 'Stop' 82 | } 83 | 84 | if ($UserAgent) { 85 | $ParamHash.UserAgent = $UserAgent 86 | } 87 | 88 | if ($Headers) { 89 | $ParamHash.Headers = $Headers 90 | } 91 | 92 | try { 93 | $Response = Invoke-WebRequest @ParamHash 94 | 95 | foreach ($CurrentPattern in $Pattern) { 96 | $Link = $Response.Links | Where-Object $MatchProperty -Match $CurrentPattern | Select-Object -First 1 -ExpandProperty $ReturnProperty 97 | 98 | if ($PrefixDomain) { 99 | $BaseURL = ($Uri -split '/' | Select-Object -First 3) -join '/' 100 | $Link = Set-UriPrefix -Uri $Link -Prefix $BaseURL 101 | } 102 | elseif ($PrefixParent) { 103 | $BaseURL = ($Uri -split '/' | Select-Object -SkipLast 1) -join '/' 104 | $Link = Set-UriPrefix -Uri $Link -Prefix $BaseURL 105 | } 106 | 107 | $Link 108 | 109 | } 110 | } 111 | catch { 112 | Write-Error "$($MyInvocation.MyCommand): $($_.Exception.Message)" 113 | } 114 | 115 | } -------------------------------------------------------------------------------- /Nevergreen/Private/Get-Version.ps1: -------------------------------------------------------------------------------- 1 | function Get-Version { 2 | <# 3 | .SYNOPSIS 4 | Extracts a version number from either a string or the content of a web page using a chosen or pre-defined match pattern. 5 | 6 | .DESCRIPTION 7 | Extracts a version number from either a string or the content of a web page using a chosen or pre-defined match pattern. 8 | 9 | .NOTES 10 | Site: https://packageology.com 11 | Author: Dan Gough 12 | Twitter: @packageologist 13 | 14 | .LINK 15 | https://github.com/DanGough/Nevergreen 16 | 17 | .PARAMETER String 18 | The string to process. 19 | 20 | .PARAMETER Uri 21 | The Uri to load web content from to process. 22 | 23 | .PARAMETER UserAgent 24 | Optional parameter to provide a user agent for Invoke-WebRequest to use. Examples are: 25 | 26 | Googlebot: 'Googlebot/2.1 (+http://www.google.com/bot.html)' 27 | Microsoft Edge: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246' 28 | 29 | .PARAMETER Pattern 30 | Optional RegEx pattern to use for version matching. Pattern to return must be included in parentheses. 31 | 32 | .PARAMETER ReplaceWithDot 33 | Switch to automatically replace characters - or _ with . in detected version. 34 | 35 | .EXAMPLE 36 | Get-Version -String 'http://somewhere.com/somefile_1.2.3.exe' 37 | 38 | Description: 39 | Returns '1.2.3' 40 | #> 41 | [CmdletBinding(SupportsShouldProcess = $False)] 42 | param ( 43 | [Parameter( 44 | Mandatory = $true, 45 | Position = 0, 46 | ValueFromPipeline = $true, 47 | ParameterSetName = 'String')] 48 | [ValidateNotNullOrEmpty()] 49 | [String[]] $String, 50 | [Parameter( 51 | Mandatory = $true, 52 | ParameterSetName = 'Uri')] 53 | [ValidatePattern('^(http|https)://')] 54 | [String] $Uri, 55 | [Parameter( 56 | Mandatory = $false, 57 | ParameterSetName = 'Uri')] 58 | [String] $UserAgent, 59 | [Parameter( 60 | Mandatory = $false, 61 | Position = 1)] 62 | [ValidateNotNullOrEmpty()] 63 | [String] $Pattern = '((?:\d+\.)+\d+)', 64 | [Switch] $ReplaceWithDot 65 | ) 66 | 67 | begin { 68 | 69 | } 70 | 71 | process { 72 | 73 | if ($PsCmdlet.ParameterSetName -eq 'Uri') { 74 | 75 | $ProgressPreference = 'SilentlyContinue' 76 | 77 | try { 78 | $ParamHash = @{ 79 | Uri = $Uri 80 | Method = 'GET' 81 | UseBasicParsing = $True 82 | DisableKeepAlive = $True 83 | ErrorAction = 'Stop' 84 | } 85 | 86 | if ($UserAgent) { 87 | $ParamHash.UserAgent = $UserAgent 88 | } 89 | 90 | $String = (Invoke-WebRequest @ParamHash).Content 91 | } 92 | catch { 93 | Write-Error "Unable to query URL '$Uri': $($_.Exception.Message)" 94 | } 95 | 96 | } 97 | 98 | foreach ($CurrentString in $String) { 99 | if ($ReplaceWithDot) { 100 | $CurrentString = $CurrentString.Replace('-','.').Replace('+','.').Replace('_','.') 101 | } 102 | if ($CurrentString -match $Pattern) { 103 | $matches[1] 104 | } 105 | else { 106 | Write-Warning "No version found within $CurrentString using pattern $Pattern" 107 | } 108 | 109 | } 110 | 111 | } 112 | 113 | end { 114 | } 115 | 116 | } -------------------------------------------------------------------------------- /Nevergreen/Private/New-NevergreenApp.ps1: -------------------------------------------------------------------------------- 1 | function New-NevergreenApp { 2 | <# 3 | .SYNOPSIS 4 | Returns a PSCustomObject to output. 5 | 6 | .DESCRIPTION 7 | Returns a PSCustomObject to output. 8 | 9 | .NOTES 10 | Site: https://packageology.com 11 | Author: Dan Gough 12 | Twitter: @packageologist 13 | 14 | .LINK 15 | https://github.com/DanGough/Nevergreen 16 | 17 | .PARAMETER Name 18 | Mandatory. The name of the application. 19 | 20 | .PARAMETER Uri 21 | Mandatory. The download URI for the application. 22 | 23 | .PARAMETER Version 24 | Mandatory. The application version. 25 | 26 | .PARAMETER Architecture 27 | Mandatory. Must match x86, x64, ARM32, ARM64 or Multi. 28 | 29 | .PARAMETER Type 30 | Mandatory. Must match Msi, Msp, Exe, Zip, Msix, AppX, AppV, 7z if supplied. 31 | 32 | .PARAMETER Language 33 | Optional. The language of the application installer, e.g. 'en'. 34 | 35 | .PARAMETER Ring 36 | Optional. The deployment ring, e.g. 'General', 'Preview'. 37 | 38 | .PARAMETER Channel 39 | Optional. The channel, e.g. 'Enterprise'. 40 | 41 | .PARAMETER Platform 42 | Optional. The platform, e.g. 'Windows Server'. 43 | 44 | .PARAMETER MD5 45 | Optional. The MD5 hash of the file. 46 | 47 | .PARAMETER SHA256 48 | Optional. The SHA256 hash of the file. 49 | 50 | .EXAMPLE 51 | New-NevergreenApp -Uri 'http://somewhere.com/something.exe' -Version '1.0' -Architecture 'x64' -Type 'Exe' 52 | 53 | Description: 54 | Outputs a PSCustomObject with the chosen properties. 55 | #> 56 | [CmdletBinding(SupportsShouldProcess = $False)] 57 | param ( 58 | [Parameter( 59 | Mandatory = $true)] 60 | [ValidateNotNullOrEmpty()] 61 | [String] $Name, 62 | [Parameter( 63 | Mandatory = $true)] 64 | [ValidateNotNullOrEmpty()] 65 | [String] $Version, 66 | [Parameter( 67 | Mandatory = $true)] 68 | [ValidatePattern('^(http|https)://')] 69 | [Alias('Url')] 70 | [String] $Uri, 71 | [Parameter( 72 | Mandatory = $true)] 73 | [ValidateSet('x86', 'x64', 'ARM32', 'ARM64', 'Multi')] 74 | [String] $Architecture, 75 | [Parameter( 76 | Mandatory = $true)] 77 | [ValidateSet('Msi', 'Msp', 'Exe', 'Zip', 'Msix', 'AppX', 'AppV', '7z')] 78 | [String] $Type, 79 | [Parameter( 80 | Mandatory = $false)] 81 | [ValidateNotNullOrEmpty()] 82 | [String] $Language, 83 | [Parameter( 84 | Mandatory = $false)] 85 | [ValidateNotNullOrEmpty()] 86 | [String] $Ring, 87 | [Parameter( 88 | Mandatory = $false)] 89 | [ValidateNotNullOrEmpty()] 90 | [String] $Channel, 91 | [Parameter( 92 | Mandatory = $false)] 93 | [ValidateNotNullOrEmpty()] 94 | [String] $Platform, 95 | [Parameter( 96 | Mandatory = $false)] 97 | [ValidateNotNullOrEmpty()] 98 | [String] $MD5, 99 | [Parameter( 100 | Mandatory = $false)] 101 | [ValidateNotNullOrEmpty()] 102 | [String] $SHA256 103 | ) 104 | 105 | $Output = [PSCustomObject]@{ 106 | Name = $Name 107 | } 108 | 109 | if ($Ring) { 110 | Add-Member -InputObject $Output -MemberType NoteProperty -Name 'Ring' -Value $Ring 111 | } 112 | 113 | if ($Channel) { 114 | Add-Member -InputObject $Output -MemberType NoteProperty -Name 'Channel' -Value $Channel 115 | } 116 | 117 | if ($Language) { 118 | Add-Member -InputObject $Output -MemberType NoteProperty -Name 'Language' -Value $Language 119 | } 120 | 121 | if ($Platform) { 122 | Add-Member -InputObject $Output -MemberType NoteProperty -Name 'Platform' -Value $Platform 123 | } 124 | 125 | if ($Architecture) { 126 | Add-Member -InputObject $Output -MemberType NoteProperty -Name 'Architecture' -Value $Architecture 127 | } 128 | 129 | if ($Type) { 130 | Add-Member -InputObject $Output -MemberType NoteProperty -Name 'Type' -Value $Type 131 | } 132 | 133 | Add-Member -InputObject $Output -MemberType NoteProperty -Name 'Version' -Value $Version 134 | Add-Member -InputObject $Output -MemberType NoteProperty -Name 'Uri' -Value $Uri 135 | 136 | if ($MD5) { 137 | Add-Member -InputObject $Output -MemberType NoteProperty -Name 'MD5' -Value $MD5 138 | } 139 | 140 | if ($SHA256) { 141 | Add-Member -InputObject $Output -MemberType NoteProperty -Name 'SHA256' -Value $SHA256 142 | } 143 | 144 | $Output 145 | } -------------------------------------------------------------------------------- /Nevergreen/Private/Resolve-Uri.ps1: -------------------------------------------------------------------------------- 1 | function Resolve-Uri { 2 | <# 3 | .SYNOPSIS 4 | Resolves a URI and also returns the filename and last modified date if found. 5 | 6 | .DESCRIPTION 7 | Resolves a URI and also returns the filename and last modified date if found. 8 | 9 | .NOTES 10 | Site: https://packageology.com 11 | Author: Dan Gough 12 | Twitter: @packageologist 13 | 14 | .LINK 15 | https://github.com/DanGough/Nevergreen 16 | 17 | .PARAMETER Uri 18 | The URI resolve. Accepts an array of strings or pipeline input. 19 | 20 | .PARAMETER UserAgent 21 | Optional parameter to provide a user agent for Invoke-WebRequest to use. Examples are: 22 | 23 | Googlebot: 'Googlebot/2.1 (+http://www.google.com/bot.html)' 24 | Microsoft Edge: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246' 25 | 26 | .EXAMPLE 27 | Resolve-Uri -Uri 'http://somewhere.com/somefile.exe' 28 | 29 | Description: 30 | Returns the absolute redirected URI, filename and last modified date. 31 | #> 32 | [CmdletBinding(SupportsShouldProcess = $False)] 33 | param ( 34 | [Parameter( 35 | Mandatory = $true, 36 | Position = 0, 37 | ValueFromPipeline, 38 | ValueFromPipelineByPropertyName)] 39 | [ValidatePattern('^(http|https)://')] 40 | [Alias('Url')] 41 | [String[]] $Uri, 42 | [Parameter( 43 | Mandatory = $false, 44 | Position = 1)] 45 | [String] $UserAgent, 46 | [System.Collections.Hashtable] $Headers 47 | ) 48 | 49 | begin { 50 | $ProgressPreference = 'SilentlyContinue' 51 | } 52 | 53 | process { 54 | 55 | foreach ($UriToResolve in $Uri) { 56 | 57 | try { 58 | 59 | $ParamHash = @{ 60 | Uri = $UriToResolve 61 | Method = 'Head' 62 | UseBasicParsing = $True 63 | DisableKeepAlive = $True 64 | ErrorAction = 'Stop' 65 | } 66 | 67 | if ($UserAgent) { 68 | $ParamHash.UserAgent = $UserAgent 69 | } 70 | 71 | if ($Headers) { 72 | $ParamHash.Headers = $Headers 73 | } 74 | 75 | $Response = Invoke-WebRequest @ParamHash 76 | 77 | if ($IsCoreCLR) { 78 | $ResolvedUri = $Response.BaseResponse.RequestMessage.RequestUri.AbsoluteUri 79 | } 80 | else { 81 | $ResolvedUri = $Response.BaseResponse.ResponseUri.AbsoluteUri 82 | } 83 | 84 | Write-Verbose "$($MyInvocation.MyCommand): URI resolved to: $ResolvedUri" 85 | 86 | #PowerShell 7 returns each header value as single unit arrays instead of strings which messes with the -match operator coming up, so use Select-Object: 87 | $ContentDisposition = $Response.Headers.'Content-Disposition' | Select-Object -First 1 88 | 89 | if ($ContentDisposition -match 'filename="?([^\\/:\*\?"<>\|]+)') { 90 | $FileName = $matches[1] 91 | Write-Verbose "$($MyInvocation.MyCommand): Content-Disposition header found: $ContentDisposition" 92 | Write-Verbose "$($MyInvocation.MyCommand): File name determined from Content-Disposition header: $FileName" 93 | } 94 | else { 95 | $Slug = [uri]::UnescapeDataString($ResolvedUri.Split('?')[0].Split('/')[-1]) 96 | if ($Slug -match '^[^\\/:\*\?"<>\|]+\.[^\\/:\*\?"<>\|]+$') { 97 | Write-Verbose "$($MyInvocation.MyCommand): URI slug is a valid file name: $FileName" 98 | $FileName = $Slug 99 | } 100 | else { 101 | $FileName = $null 102 | } 103 | } 104 | 105 | try { 106 | $LastModified = [DateTime]($Response.Headers.'Last-Modified' | Select-Object -First 1) 107 | Write-Verbose "$($MyInvocation.MyCommand): Last modified date: $LastModified" 108 | } 109 | catch { 110 | Write-Verbose "$($MyInvocation.MyCommand): Unable to parse date from last modified header: $($Response.Headers.'Last-Modified')" 111 | $LastModified = $null 112 | } 113 | 114 | } 115 | catch { 116 | Throw "$($MyInvocation.MyCommand): Unable to resolve URI: $($_.Exception.Message)" 117 | } 118 | 119 | if ($ResolvedUri) { 120 | [PSCustomObject]@{ 121 | Uri = $ResolvedUri 122 | FileName = $FileName 123 | LastModified = $LastModified 124 | } 125 | } 126 | 127 | } 128 | } 129 | 130 | end { 131 | } 132 | 133 | } -------------------------------------------------------------------------------- /Nevergreen/Private/Set-UriPrefix.ps1: -------------------------------------------------------------------------------- 1 | function Set-UriPrefix { 2 | <# 3 | .SYNOPSIS 4 | Prefixes a URI with a specific domain if one is not already present. 5 | 6 | .DESCRIPTION 7 | Some web pages store URIs as relative paths, this function will prefix such URLs with a chosen domain. 8 | 9 | .NOTES 10 | Site: https://packageology.com 11 | Author: Dan Gough 12 | Twitter: @packageologist 13 | 14 | .LINK 15 | https://github.com/DanGough/Nevergreen 16 | 17 | .PARAMETER Uri 18 | The URI to process. 19 | 20 | .PARAMETER Prefix 21 | The prefix to add to the URI. 22 | 23 | .EXAMPLE 24 | Set-UriPrefix -Uri '/somefile.exe' -Prefix 'http://somewhere.com' 25 | 26 | Description: 27 | Returns 'http://somewhere.com/somefile.exe' 28 | #> 29 | [CmdletBinding(SupportsShouldProcess = $False)] 30 | param ( 31 | [Parameter( 32 | Mandatory = $true, 33 | Position = 0, 34 | ValueFromPipeline, 35 | ValueFromPipelineByPropertyName)] 36 | [ValidateNotNullOrEmpty()] 37 | [Alias('Url')] 38 | [System.String] $Uri, 39 | [Parameter( 40 | Mandatory = $true, 41 | Position = 1)] 42 | [ValidatePattern('^(http|https)://')] 43 | [System.String] $Prefix 44 | ) 45 | 46 | if ($Uri -like '^http') { 47 | # Nothing to do, return input 48 | $Uri 49 | } 50 | else { 51 | # Output joined strings 52 | $Prefix.TrimEnd('/') + "/" + $Uri.TrimStart('/') 53 | } 54 | } -------------------------------------------------------------------------------- /Nevergreen/Public/Find-NevergreenApp.ps1: -------------------------------------------------------------------------------- 1 | function Find-NevergreenApp { 2 | <# 3 | .SYNOPSIS 4 | Returns a list of all apps currently supported by Nevergreen. 5 | 6 | .DESCRIPTION 7 | Retrieves a list of supported applications by querying Get-*.ps1 under the Apps folder. 8 | 9 | .NOTES 10 | Site: https://packageology.com 11 | Author: Dan Gough 12 | Twitter: @packageologist 13 | 14 | .LINK 15 | https://github.com/DanGough/Nevergreen 16 | 17 | .PARAMETER Name 18 | The application name to return details for. Uses a RegEx match so will return all apps where the name contains the supplied string. Accepts an array for multiple matches, or can also accept values from the pipeline. 19 | 20 | .EXAMPLE 21 | Find-NevergreenApp 22 | 23 | Description: 24 | Returns a list of all currently supported applications. 25 | 26 | .EXAMPLE 27 | Find-NevergreenApp -Name 'Microsoft' 28 | 29 | Description: 30 | Returns a list of all currently supported applications with 'Microsoft' in the name. 31 | 32 | .EXAMPLE 33 | Find-NevergreenApp -Name 'Adobe','Microsoft' 34 | 35 | Description: 36 | Returns a list of all currently supported applications matching 'Adobe' or 'Microsoft'. 37 | #> 38 | [CmdletBinding(SupportsShouldProcess = $False)] 39 | param ( 40 | [Parameter( 41 | Mandatory = $false, 42 | Position = 0, 43 | ValueFromPipeline, 44 | ValueFromPipelineByPropertyName)] 45 | [System.String[]] $Name = '' 46 | ) 47 | 48 | begin { 49 | $AppDir = [System.IO.Path]::Combine((Split-Path -Path $PSScriptRoot -Parent), 'Apps') 50 | $Apps = (Get-ChildItem -Path $AppDir).BaseName -replace '^Get-' 51 | $Results = @() 52 | } 53 | 54 | process { 55 | foreach ($AppName in $Name) { 56 | $Results += $Apps | Where-Object { $_ -match $AppName } 57 | } 58 | } 59 | 60 | end { 61 | $Results | Select-Object -Unique 62 | } 63 | } -------------------------------------------------------------------------------- /Nevergreen/Public/Get-NevergreenApp.ps1: -------------------------------------------------------------------------------- 1 | function Get-NevergreenApp { 2 | <# 3 | .SYNOPSIS 4 | Attempts to retrieve the latest version and download link for the selected application. 5 | 6 | .DESCRIPTION 7 | The application name must be a valid supported name - use Find-Nevergreen app to list supported applications. The output of this command may retrieve multiple results, filter using Where-Object and Select-Object where appropriate. 8 | 9 | .NOTES 10 | Site: https://packageology.com 11 | Author: Dan Gough 12 | Twitter: @packageologist 13 | 14 | .LINK 15 | https://github.com/DanGough/Nevergreen 16 | 17 | .PARAMETER Name 18 | The application name to return details for. Must be an exact match for a supported application name. 19 | 20 | .EXAMPLE 21 | Get-NevergreenApp -Name MicrosoftPowerBIDesktop 22 | 23 | Description: 24 | Returns the latest version and download links for all available platforms. 25 | 26 | .EXAMPLE 27 | Get-NevergreenApp -Name MicrosoftPowerBIDesktop | Where-Object {$_.Architecture -eq 'x64'} 28 | 29 | Description: 30 | Returns the latest version and download links for the 64-bit version only. 31 | 32 | .EXAMPLE 33 | Find-NevergreenApp | Get-NevergreenApp 34 | 35 | Description: 36 | List results for all apps! 37 | #> 38 | [OutputType([System.Management.Automation.PSObject])] 39 | [CmdletBinding(SupportsShouldProcess = $False)] 40 | param ( 41 | [Parameter( 42 | Mandatory = $true, 43 | Position = 0, 44 | ValueFromPipeline, 45 | ValueFromPipelineByPropertyName, 46 | HelpMessage = "Specify an application name. Use Find-NevergreenApp to list supported applications.")] 47 | [ValidateNotNull()] 48 | [System.String[]] $Name 49 | ) 50 | 51 | begin { 52 | $AppDir = [System.IO.Path]::Combine((Split-Path -Path $PSScriptRoot -Parent), 'Apps') 53 | $ProgressPreference = 'SilentlyContinue' 54 | } 55 | 56 | process { 57 | foreach ($AppName in $Name) { 58 | $Script = [System.IO.Path]::Combine($AppDir, "Get-$AppName.ps1") 59 | if (Test-Path -LiteralPath $Script -PathType Leaf) { 60 | try { 61 | $Output = &$Script 62 | if ($Output.Version -and $Output.Uri) { 63 | $Output 64 | } 65 | } 66 | catch { 67 | Write-Error -Message "Error retriving results for '$AppName': $($_.Exception.Message)" 68 | } 69 | } 70 | else { 71 | Write-Error "Unknown application name: $AppName" 72 | } 73 | } 74 | } 75 | 76 | end { 77 | } 78 | } -------------------------------------------------------------------------------- /Nevergreen/WIP/Get-PlantronicsHub.ps1: -------------------------------------------------------------------------------- 1 | $Version = Get-Version -Uri 'https://www.poly.com/gb/en/support/downloads-apps/hub-desktop' -Pattern 'Version ((?:\d+\.)+\d+)' 2 | 3 | $URL32 = Get-Link -Uri 'https://www.poly.com/gb/en/support/downloads-apps/hub-desktop' -MatchProperty href -Pattern 'PlantronicsHubInstaller\.exe$' -PrefixDomain 4 | 5 | New-NevergreenApp -Name 'Plantronics Hub' -Version $Version -Uri $URL32 -Architecture 'x86' -Type 'Exe' -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nevergreen 2 | 3 | ## About 4 |
5 | 6 | Nevergreen is a Powershell module that returns the latest version and download links for various Windows applications. 7 |
8 | 9 | It can be used as an alternative to the excellent [Evergreen](https://github.com/aaronparker/Evergreen) module, for apps that project does not support, or where it might not return the results you want. 10 |
11 | 12 | Evergreen relies on API queries to obtain its data, and HTML scraping is not welcome. This is the reason Nevergreen was born, a place to accept all the Evergreen rejects! Please note this method is inherently more prone to breaking when websites are changed, hence the name! 13 |
14 |
15 | 16 | ## Supported apps 17 |
18 | 19 | - 7-Zip (Evergreen URLs return HTML files at present and version is not the latest) 20 | - 8x8 Work 21 | - Adobe/Harman AIR 22 | - Adobe Creative Cloud 23 | - Adobe Acrobat Reader / Pro 24 | - MSP update patches only 25 | - Evergreen does not always report the latest optional releases, whereas this implementation should. 26 | - Advanced Installer 27 | - Advanced IP Scanner 28 | - Advanced Port Scanner 29 | - Anaconda 30 | - Apple iTunes 31 | - AutoIt 32 | - Cisco Webex 33 | - Cisco Webex Access Anywhere 34 | - Cisco Webex Support Manager 35 | - Citrix ShareFile 36 | - Druide Antidote 37 | - Eclipse Temeru Runtime (AKA AdoptOpenJDK Hotspot) 38 | - Elgato 4K Capture Utility 39 | - Elgato Audio Effects 40 | - Elgato Camera Hub 41 | - Elgato Control Center 42 | - Elgato Game Capture 43 | - Elgato Stream Deck 44 | - Elgato Video Capture 45 | - FileOpen Plugin 46 | - Fujifilm Pixel Shift Combiner 47 | - Fujifilm Raw File Converter EX 48 | - Fujifilm X Acquire 49 | - Fujifilm X Raw Studio 50 | - Fujifilm X Webcam 51 | - Google Drive 52 | - Google Earth Pro 53 | - IBM Semeru Runtime (AKA AdoptOpenJDK OpenJ9) 54 | - IGEL Universal Management Suite 55 | - Jabra Direct 56 | - Komodo Labs NEWT Professional 57 | - Komodo Labs Slitheris 58 | - Lenovo Commercial Vantage 59 | - LibreOffice / LibreOfficeHelp 60 | - Logitech Camera Setings 61 | - LSoft Active Disk Image Lite 62 | - LSoft Active Boot Disk 63 | - Microsoft Azure CLI 64 | - Microsoft Office Deployment Tool 65 | - Microsoft OpenJDK 66 | - Microsoft Power BI Desktop 67 | - Microsoft Power BI Report Builder 68 | - Microsoft Purview Information Protection Client 69 | - Microsoft SSMS 70 | - This is already in Evergreen but has a known issue against it where the feed is providing the build version rather than the release version most know it by. 71 | - Microsoft Sysinternals tools (all suites and individual tools) 72 | - Microsoft Windows ADK 73 | - Mimecast for Outlook 74 | - Miniconda 75 | - nmap 76 | - Npcap 77 | - Opera 78 | - OpenVPN Community 79 | - OpenVPN Connect 80 | - PatchMyPC Publisher 81 | - PatchMyPC Advanced Insights 82 | - PatchMyPC Return On Investment Tool 83 | - PatchMyPC MEM Patching Optimizer 84 | - Philippe Jounin Tftpd64 85 | - PingIdentity PingID 86 | - Python 87 | - QGIS 88 | - Radio Detection CAT Manager 89 | - Redstor Backup Pro Storage Platform Console 90 | - RIA eID 91 | - TMurgent AppVDefConGroups 92 | - TMurgent AppVManage 93 | - TMurgent AppVManifestEditor 94 | - TMurgent PsfTooling 95 | - TMurgent PullApps 96 | - TMurgent TMEdit 97 | - TMurgent TMEditX 98 | - Zebra Card Studio 99 | - Zoom VDI 100 | - This is already in Evergreen but the VDI downloads just return the version as 'Latest' 101 | 102 |
103 | 104 | The [Apps folder in the main branch](https://github.com/DanGough/Nevergreen/tree/main/Nevergreen/Apps) will always show the apps supported in the latest release. 105 |
106 | 107 | Also, you can check the [latest commits to the Apps folder in the dev branch](https://github.com/DanGough/Nevergreen/commits/dev/Nevergreen/Apps) to see what's being worked on. 108 |
109 |
110 | 111 | ## Bugs 112 |
113 | 114 | Because these apps rely on HTML scraping, they are prone to breakage when the websites are changed. If you encounter an issue, please file a report under the [Issues](https://github.com/DanGough/Nevergreen/issues) tab. 115 |
116 | 117 | Fix contributions are also welcomed - fork the repository, create the fix in a new branch in your copy, then create a pull request for me to review. If you're not familiar with Git, just post the fixed code directly within the issue. 118 |
119 |
120 | 121 | ## Requests 122 |
123 | 124 | If you have a request to add an application to Nevergreen, please abide by the following: 125 |
126 | 127 | - If the app has a queryable API feed to obtain the latest version, it is better suited for inclusion in [Evergreen](https://github.com/aaronparker/Evergreen). It can be hard to find these API feeds, but if for example the app in question is hosted on Github, Evergreen has built-in functions for getting those apps easily. 128 | 129 | - Please check the [New Apps](https://github.com/DanGough/Nevergreen/projects/1) area under the [Projects](https://github.com/DanGough/Nevergreen/projects) tab to see if the app is already on the to-do list. 130 | 131 | - If it is not, you are welcome to add a request via the [Issues](https://github.com/DanGough/Nevergreen/issues) tab. Please include any helpful information such as the URLs for the download page and release notes if possible. 132 |
133 | 134 | ## Supported Powershell Versions 135 |
136 | 137 | This has been tested with Powershell 5.1 and 7.x, and the module manifests lists the minimum supported version as 5.1. It may work on 3.0, but it has never been tested. 138 |
139 |
140 | 141 | ## Installation 142 | 143 | ### Powershell Gallery 144 |
145 | 146 | Simply install directly from the [Powershell Gallery](https://www.powershellgallery.com/packages/Nevergreen) by running the following command: 147 |
148 | 149 | ```powershell 150 | Install-Module -Name Nevergreen 151 | ``` 152 |
153 | 154 | To update: 155 | ```powershell 156 | Update-Module -Name Nevergreen 157 | ``` 158 |
159 | 160 | ### Manual Installation 161 |
162 | 163 | Download the latest Main branch, either by downloading the zip file directly from Github, or by installing [Git](https://git-scm.com/downloads) and typing: 164 |
165 | 166 | ``` 167 | git clone https://github.com/DanGough/Nevergreen.git 168 | ``` 169 |
170 | 171 | If you downloaded and extracted a zip file, you may need to unblock the files first: 172 | ```powershell 173 | Get-ChildItem -Path -Recurse | Unblock-File 174 | ``` 175 |
176 | 177 | Then from within the Nevergreen folder, run the following command to temporarily import the module into your session: 178 | 179 | ```powershell 180 | Import-Module .\Nevergreen\Nevergreen.psd1 181 | ``` 182 |
183 | 184 | You can also copy it to one of the folders listed under `$env:PSModulePath` to make it available in all future sessions without having to import it. 185 |
186 |
187 | 188 | ## Usage 189 |
190 | 191 | List all supported apps: 192 | ```powershell 193 | Find-NevergreenApp 194 | ``` 195 |
196 | 197 | List all Adobe and Microsoft apps (accepts arrays and uses a RegEx match): 198 | ```powershell 199 | Find-NevergreenApp -Name Adobe,Microsoft 200 | ``` 201 |
202 | 203 | Get version and download links for Microsoft Power BI Desktop (all platforms): 204 | ```powershell 205 | Get-NevergreenApp -Name MicrosoftPowerBIDesktop 206 | ``` 207 |
208 | 209 | Get version and download links for Microsoft Power BI Desktop (64-bit only): 210 | ```powershell 211 | Get-NevergreenApp -Name MicrosoftPowerBIDesktop | Where-Object {$_.Architecture -eq 'x64'} 212 | ``` 213 |
214 | 215 | Combine both commands to get all results! 216 | ```powershell 217 | Find-NevergreenApp | Get-NevergreenApp 218 | ``` 219 | 220 | 221 |
222 | -------------------------------------------------------------------------------- /Test/ImportFunctions.ps1: -------------------------------------------------------------------------------- 1 | # For quickly dot-sourcing all functions into current session for testing 2 | 3 | $Public = @(Get-ChildItem -Path ([System.IO.Path]::Combine($PSScriptRoot, '..\Nevergreen\Public', '*.ps1'))) 4 | $Private = @(Get-ChildItem -Path ([System.IO.Path]::Combine($PSScriptRoot, '..\Nevergreen\Private', '*.ps1')) -ErrorAction Ignore) 5 | 6 | ForEach ($Import in @($Public + $Private)) { 7 | Try { 8 | . $Import.FullName 9 | } 10 | Catch { 11 | Write-Error -Message "Failed to import function $($Import.FullName): $_" 12 | } 13 | } -------------------------------------------------------------------------------- /Test/Nevergreen.Tests.ps1: -------------------------------------------------------------------------------- 1 | $PSModulePath = [System.IO.Path]::Combine((Split-Path -Path $PSScriptRoot -Parent), 'Nevergreen') 2 | $ModuleManifestPath = [System.IO.Path]::Combine($PSModulePath, 'Nevergreen.psd1') 3 | 4 | Describe 'Module Manifest Tests' { 5 | It 'Passes Test-ModuleManifest' { 6 | Test-ModuleManifest -Path $ModuleManifestPath | Should -Not -BeNullOrEmpty 7 | $? | Should -Be $true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Test/Test.ps1: -------------------------------------------------------------------------------- 1 | . "$PSScriptRoot\ImportFunctions.ps1" 2 | Remove-Item "$env:temp\Nevergreen.log" -ErrorAction Ignore 3 | Start-Transcript -Path "$env:temp\Nevergreen.log" -Force -UseMinimalHeader 4 | Clear-Host 5 | Write-Host "PowerShell version: $($PSVersionTable.PSVersion)" 6 | $Apps = Find-NevergreenApp 7 | 8 | foreach ($App in $Apps) { 9 | Write-Host "$App`:" 10 | try { 11 | $Result = Get-NevergreenApp $App 12 | $Result | Format-List 13 | #$Result.URI | ForEach-Object { 14 | #Invoke-Download $_ 15 | #} 16 | } 17 | catch { 18 | Write-Error $_ 19 | } 20 | } 21 | Stop-Transcript --------------------------------------------------------------------------------