powershell_check_for_updates
This is an old revision of the document!
Powershell Check for Updates
#requires -version 3.0 #### Check for updates #### Version 1.1 #### Last updated 2013-11-18 #### The cononical version of this script is at http://tallguyracing.com/wiki/doku.php?id=powershell_check_for_updates $appsToCheck = ('TrueCrypt', 'Anki', 'ConEmu', 'Paint.NET', 'Rockbox', 'DokuWiki', 'GIMP', '7zip', 'WinMerge', 'Foobar2000', 'Fiddler', 'Process Explorer', 'Process Monitor', 'Notepad++', 'VLC', 'FileZilla', 'ImageMagick', 'TortoiseSVN') $versionNumbers = @{ 'TrueCrypt' = '7.1a' ; 'Anki' = '2.0.18' ; 'ConEmu' = '131117' ; 'Paint.NET' = '3.5.11' ; 'Rockbox' = '3.13' ; 'DokuWiki' = '2013-05-10' ; 'Notepad++' = '6.5.1' # Hopefully, this can be reverted to a fully automatic check in the future. } function GetVersionNumberFromWeb ($appName, $url, $regexPattern) { $response = Invoke-WebRequest -Uri $url if ($response.StatusCode -ne 200) { Write-Host "FAILED: ${appName}: Could not get the web page." -ForegroundColor Red Write-Host " ${response.StatusCode}: ${response.StatusDescription}" -ForegroundColor Red return } $versionNumberMatches = ([regex]$regexPattern).matches($response.Content) if ($versionNumberMatches.Count -eq 0) { Write-Host "FAILED: ${appName}: Could not get version number from the web page. Nothing matched the regex." -ForegroundColor Red return } if ($versionNumberMatches.Count -ne 1) { Write-Host "FAILED: ${appName}: Could not get version number from the web page. The regex had more than one match." -ForegroundColor Red return } if (! $versionNumberMatches[0].Success) { Write-Host "FAILED: ${appName}: Could not get version number from the web page. The regex match was not successful." -ForegroundColor Red return } if (! $versionNumberMatches[0].Groups["versionNumber"].Success) { Write-Host "FAILED: ${appName}: Could not get version number from the web page. The regex group was not successful." -ForegroundColor Red return } $latestVersionNumber = $versionNumberMatches[0].Groups["versionNumber"].Value Write-Host "${appName}: The latest version number is $LatestVersionNumber." return $latestVersionNumber } function CheckLocalFile ($appName, $url, $regexPattern, $localFilename, $extraFormatting) { $appInfo = Get-Command $localFilename $currentVersionNumber = $appInfo.FileVersionInfo.ProductVersion if ($extraFormatting.Contains(';CommaToFullStop;')) { $currentVersionNumber = $currentVersionNumber.Replace(',', '.') } if ($extraFormatting.Contains(';RemoveSpaces;')) { $currentVersionNumber = $currentVersionNumber.Replace(' ', '') } if ($extraFormatting.Contains(';TrimTrailingDotZero;') -and $currentVersionNumber.EndsWith('.0')) { $currentVersionNumber = $currentVersionNumber.Substring(0, $currentVersionNumber.Length - 2) } if ($extraFormatting.Contains(';FirstThreeDigitsOnly;')) { if (! ($currentVersionNumber -match "\d+(?:\.\d+){2}")) { Write-Host "FAILED: ${appName}: Could not get the first three digits of the version number from '$currentVersionNumber'." -ForegroundColor Red return } $currentVersionNumber = $Matches.Values } CheckCurrentVersionNumber $appName $url $regexPattern $currentVersionNumber } function CheckCurrentVersionNumber ($appName, $url, $regexPattern, $currentVersionNumber) { $latestVersionNumber = GetVersionNumberFromWeb $appName $url $regexPattern if (! $latestVersionNumber) { return } Write-Host "${appName}: The current version number is $currentVersionNumber." if ($currentVersionNumber -ne $latestVersionNumber) { Write-Host "${appName}: Update required!" -ForegroundColor Green } else { Write-Host "${appName}: No update required." } } function CheckAppCurrentVersionNumber ($appName) { switch ($appName) { #### Semi-automatic checks #### 'TrueCrypt' { CheckCurrentVersionNumber 'TrueCrypt' 'http://www.truecrypt.org/downloads' ` '\>Latest Stable Version - (?<versionNumber>\d+\.\d+\w+)\<' ` $versionNumbers['TrueCrypt'] } 'Anki' { CheckCurrentVersionNumber 'Anki' 'http://ankisrs.net/' ` 'href="http://ankisrs\.net/download/mirror/anki-(?<versionNumber>\d+(?:\.\d+){2})\.exe"' ` $versionNumbers['Anki'] } 'ConEmu' { CheckCurrentVersionNumber 'ConEmu' 'http://conemu.codeplex.com/' ` 'ConEmu (?<versionNumber>\d+\w+) \[Alpha\]' ` $versionNumbers['ConEmu'] } 'Paint.NET' { CheckCurrentVersionNumber 'Paint.NET' 'http://www.getpaint.net/index.html' ` '>Paint\.NET\s*v(?<versionNumber>\d+(?:\.\d+){2})<' ` $versionNumbers['Paint.NET'] } 'Rockbox' { CheckCurrentVersionNumber 'Rockbox' 'http://www.rockbox.org/download/' ` '<h1>Rockbox (?<versionNumber>\d+(?:\.\d+){1,2}) Download</h1>' ` $versionNumbers['Rockbox'] } 'DokuWiki' { CheckCurrentVersionNumber 'DokuWiki' 'http://download.dokuwiki.org/' ` '<a href="src/dokuwiki/dokuwiki-stable\.tgz">\(direct link\)</a>\s*<span class="hint">(?<versionNumber>\d{4}-\d{2}-\d{2}).+?</span>' ` $versionNumbers['DokuWiki'] } 'Notepad++' { CheckCurrentVersionNumber 'Notepad++' 'http://notepad-plus-plus.org/download/' ` '<title>Notepad\+\+ v(?<versionNumber>\d+(?:\.\d+){1,2}) - Current Version</title>' ` $versionNumbers['Notepad++'] } #### Fully-automatic checks #### 'GIMP' { CheckLocalFile 'GIMP' 'http://www.gimp.org/downloads/' ` 'href="http://ftp\.gimp\.org/pub/gimp/[^/]+/windows/gimp-(?<versionNumber>\d+(?:\.\d+){2})-setup.exe"' ` 'C:\Program Files\GIMP 2\bin\gimp-2.8.exe' '' } '7zip' { CheckLocalFile '7zip' 'http://www.7-zip.org/' ` 'Download 7-Zip (?<versionNumber>\d+(?:\.\d+){1,2}) \(\d+-\d+-\d+\) for Windows' ` 'C:\Program Files (x86)\7-Zip\7z.exe' '' } 'WinMerge' { CheckLocalFile 'WinMerge' 'http://winmerge.org/' ` 'href="http://downloads.sourceforge.net/winmerge/WinMerge-(?<versionNumber>\d+(?:\.\d+){2})-Setup.exe"' ` 'C:\Program Files (x86)\WinMerge\WinMergeU.exe' '' } 'Foobar2000' { CheckLocalFile 'Foobar2000' 'http://www.foobar2000.org/download' ` 'href="/getfile/[^/]+/foobar2000_v(?<versionNumber>\d+(?:\.\d+){2}).exe">foobar2000 v\d+(?:\.\d+){2}' ` 'C:\Program Files (x86)\foobar2000\foobar2000.exe' ` ';TrimTrailingDotZero;' } 'Fiddler' { CheckLocalFile 'Fiddler' 'http://fiddler2.com/get-fiddler' ` '\<p id="Content_C014_ctl00_ctl00_BottomContentTag"\>Version (?<versionNumber>\d+(?:\.\d+){2,3})\</p\>' ` 'C:\Program Files (x86)\Fiddler2\fiddler.exe' '' } 'Process Explorer' { CheckLocalFile 'Process Explorer' 'http://technet.microsoft.com/en-US/sysinternals/bb896653' ` '<h1>Process Explorer v(?<versionNumber>\d+\.\d+)</h1>' ` 'C:\Program Files (x86)\ProcessExplorer\procexp.exe' '' } 'Process Monitor' { CheckLocalFile 'Process Monitor' 'http://technet.microsoft.com/en-US/sysinternals/bb896645' ` '<h1>Process Monitor v(?<versionNumber>\d+\.\d+)</h1>' ` 'C:\Program Files (x86)\ProcessMonitor\procmon.exe' '' } # Next time the version changes, try using this rather than the Semi-automatic check. # 'Notepad++' # { # CheckLocalFile 'Notepad++' 'http://notepad-plus-plus.org/download/' ` # '<title>Notepad\+\+ v(?<versionNumber>\d+(?:\.\d+){1,2}) - Current Version</title>' ` # 'C:\Program Files (x86)\Notepad++\notepad++.exe' '' # } 'VLC' { CheckLocalFile 'VLC' 'http://videolan.org/vlc/' ` 'href=''//get.videolan.org/vlc/(?:\d+(?:\.\d+){2})/win32/vlc-(?<versionNumber>\d+(?:\.\d+){2})-win32.exe''>' ` 'C:\Program Files (x86)\VideoLAN\VLC\vlc.exe' ` ';CommaToFullStop;TrimTrailingDotZero;' } 'FileZilla' { CheckLocalFile 'FileZilla' 'http://filezilla-project.org/download.php?type=client' ` '>The latest stable version of FileZilla Client is (?<versionNumber>\d+(?:\.\d+){2})<' ` 'C:\Program Files (x86)\FileZilla FTP Client\filezilla.exe' ` ';CommaToFullStop;RemoveSpaces;TrimTrailingDotZero;' } 'ImageMagick' { CheckLocalFile 'ImageMagick' 'http://www.imagemagick.org/script/binary-releases.php' ` '>ImageMagick-(?<versionNumber>\d+(?:\.\d+){2})(?:-\d+)?-Q16-x64-dll\.exe<' ` 'C:\Program Files\ImageMagick\mogrify.exe' '' } 'TortoiseSVN' { CheckLocalFile 'TortoiseSVN' 'http://tortoisesvn.net/downloads.html' ` '>The current version is (?<versionNumber>\d+(?:\.\d+){2})<' ` 'C:\Program Files\TortoiseSVN\bin\TortoiseSVN.dll' ` ';FirstThreeDigitsOnly;' } default { Write-Host "FAILED: ${appName}: Unknown app." -ForegroundColor Red } } } foreach ($appName in $AppsToCheck) { CheckAppCurrentVersionNumber ($appName) } Write-Host "Press any key to exit." $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
powershell_check_for_updates.1384762451.txt.gz · Last modified: 2017/01/01 19:51 (external edit)