Last active
January 22, 2025 03:35
Update-LibreOffice.ps1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Update-LibreOffice.ps1 | |
# Written by Bill Stewart (bstewart AT iname.com) | |
#requires -RunAsAdministrator | |
#requires -Version 5 | |
<# | |
.SYNOPSIS | |
Downloads and optionally installs the latest version of LibreOffice. | |
.DESCRIPTION | |
Downloads and optionally installs the latest version of LibreOffice, including offline help. Requires internet access. | |
.PARAMETER DownloadPath | |
Specify the path where to download the LibreOffice installer (.msi) packages. | |
.PARAMETER LogFilePath | |
Specifies the path and filename of the log file if the -EnableLogging parameter is specified. | |
.PARAMETER HelpLanguage | |
Specifies the language for the offline help package. The default is the current locale. | |
.PARAMETER EnableLogging | |
Enables logging to the log file path specified by the -LogFilePath parameter. If you omit the -LogFilePath parameter, the log file is the same path and filename as the script, except for the '.log' extension. | |
.PARAMETER Install | |
Automatically starts the installation after downloading completes. | |
.PARAMETER Quiet | |
Runs the installation of the packages without user interaction. | |
#> | |
[CmdletBinding()] | |
param( | |
[Parameter(Position = 0,Mandatory)] | |
[ValidateNotNullOrEmpty()] | |
[String] | |
$DownloadPath, | |
[String] | |
$LogFilePath, | |
[ValidateNotNullOrEmpty()] | |
[String] | |
$HelpLanguage = (Get-Culture).Name, | |
[Switch] | |
$EnableLogging, | |
[Switch] | |
$Install, | |
[Switch] | |
$Quiet | |
) | |
function Get-LibreOfficeLatestVersion { | |
$url = "http://download.documentfoundation.org/libreoffice/stable/" | |
$pattern = '<tr><td valign="top"> </td><td><a href="((?:\d+\.){1,3}\d+)' | |
$webContent = (Invoke-WebRequest $url -UseBasicParsing | | |
Select-Object -ExpandProperty Content) -split "`n" | |
if ( $null -ne $webContent ) { | |
$webContent | | |
Select-String $pattern | | |
ForEach-Object { | |
$_.Matches[0].Groups[1].Value | |
} | Sort-Object { $_ -as [Version] } | Select-Object -Last 1 | |
} | |
} | |
function Get-LibreOfficeInstalledVersion { | |
$keyPath = "HKLM:SOFTWARE\LibreOffice\LibreOffice" | |
$currentVersion = Get-ChildItem $keyPath -ErrorAction SilentlyContinue | | |
Select-Object -ExpandProperty Name | | |
Split-Path -Leaf | | |
Sort-Object | | |
Select-Object -Last 1 | |
if ( $null -ne $currentVersion ) { | |
$path = (Get-ItemProperty (Join-Path $keyPath $currentVersion)).Path | |
if ( $null -ne $path ) { | |
$item = Get-Item -LiteralPath $path -ErrorAction SilentlyContinue | |
if ( $null -ne $item ) { | |
$item.VersionInfo.ProductVersion | |
} | |
} | |
} | |
} | |
function Get-Platform { | |
$result = "x86" | |
$sysType = Get-WmiObject Win32_ComputerSystem | | |
Select-Object -ExpandProperty SystemType | |
if ( $sysType -like "*x64*" ) { | |
$osArch = Get-WmiObject Win32_OperatingSystem | | |
Select-Object -ExpandProperty OSArchitecture | |
if ( $osArch -eq "64-bit" ) { | |
$result = "x86_64" | |
} | |
} | |
return $result | |
} | |
function Join-URLPath { | |
param( | |
[String] | |
$part1, | |
[String] | |
$part2 | |
) | |
while ( $part1[$part1.Length - 1] -eq "/" ) { | |
$part1 = $part1.Substring(0,$part1.Length - 1) | |
} | |
"{0}/{1}" -f $part1,$part2 | |
} | |
function Get-LibreOfficeLatestPackage { | |
param( | |
[Parameter(Mandatory)] | |
[ValidateNotNullOrEmpty()] | |
[String] | |
$downloadPath, | |
[Parameter(Mandatory)] | |
[ValidateNotNullOrEmpty()] | |
[String] | |
$latestVersion | |
) | |
$platform = Get-Platform | |
if ( $platform -eq "x86_64" ) { | |
$fileNames = @( | |
"LibreOffice_{0}_Win_x86-64.msi" -f $latestVersion | |
"LibreOffice_{0}_Win_x86-64_helppack_{1}.msi" -f $latestVersion,$HelpLanguage | |
) | |
} | |
else { | |
$fileNames = @( | |
"LibreOffice_{0}_Win_x86.msi" -f $latestVersion | |
"LibreOffice_{0}_Win_x86_helppack_{1}.msi" -f $latestVersion,$HelpLanguage | |
) | |
} | |
$remotePath = "http://download.documentfoundation.org/libreoffice/stable/$latestVersion/win/$platform/" | |
foreach ( $fileName in $fileNames ) { | |
$url = Join-URLPath $remotePath $fileName | |
$downloadFileName = Join-Path $downloadPath $fileName | |
Write-Host "Download: $url" | |
$timeSpan = Measure-Command { Invoke-WebRequest -Uri $url -OutFile $downloadFileName } | |
if ( $? ) { | |
$downloadFileName | |
Write-Host ('Downloaded {0} [{1:N0} byte(s) in {2}]' -f $downloadFileName, | |
(Get-Item $downloadFileName).Length,$timeSpan) | |
} | |
} | |
} | |
function Get-Version { | |
[CmdletBinding()] | |
param( | |
[Version] | |
$version | |
) | |
$major = [Math]::Max($version.Major,0) | |
$minor = [Math]::Max($version.Minor,0) | |
$build = [Math]::Max($version.Build,0) | |
$revision = [Math]::Max($version.Revision,0) | |
return New-Object Version($major,$minor,$build,$revision) | |
} | |
if ( $EnableLogging ) { | |
if ( -not $LogFilePath ) { | |
$LogFilePath = "{0}.log" -f (Join-Path $PSScriptRoot ([IO.Path]::GetFileNameWithoutExtension($MyInvocation.MyCommand.Name))) | |
} | |
else { | |
if ( ($LogFilePath -notlike "*\*") -or ($LogFilePath -notlike "*/*") ) { | |
$LogFilePath = Join-Path $PSScriptRoot $LogFilePath | |
} | |
} | |
Start-Transcript $LogFilePath | |
if ( -not $? ) { | |
return | |
} | |
} | |
$LatestVersion = Get-LibreOfficeLatestVersion | |
if ( -not $LatestVersion ) { | |
if ( $EnableLogging ) { | |
Stop-Transcript | |
} | |
return | |
} | |
Write-Host "Latest LibreOffice version: $LatestVersion" | |
$InstalledVersion = Get-LibreOfficeInstalledVersion | |
if ( -not $InstalledVersion ) { | |
$InstalledVersion = "0.0.0.0" | |
Write-Host "LibreOffice not installed" | |
} | |
else { | |
Write-Host "LibreOffice installed version: $InstalledVersion" | |
} | |
if ( (Get-Version $LatestVersion) -gt (Get-Version $InstalledVersion) ) { | |
if ( $Quiet ) { | |
$Stopwatch = New-Object Diagnostics.Stopwatch | |
$Stopwatch.Start() | |
} | |
$DownloadFileNames = Get-LibreOfficeLatestPackage $DownloadPath $LatestVersion | |
if ( $Install ) { | |
$MsiExec = Join-Path ([Environment]::GetFolderPath([Environment+SpecialFolder]::System)) "msiexec.exe" | |
$StartArgs = @{ | |
"FilePath" = $MsiExec | |
"Wait" = $true | |
} | |
foreach ( $DownloadFileName in $DownloadFileNames ) { | |
$StartArgs.ArgumentList = '/i',('"{0}"' -f $DownloadFileName) | |
if ( $Quiet ) { | |
$StartArgs.ArgumentList += '/qb-','REBOOT=ReallySuppress' | |
} | |
$Message = 'Run: {0} {1}' -f $MsiExec,($StartArgs.ArgumentList -join ' ') | |
Write-Host $Message | |
$timeSpan = Measure-Command { Start-Process @StartArgs } | |
if ( $Quiet ) { | |
Write-Host "Installation completed in $timeSpan" | |
} | |
} | |
} | |
if ( $Quiet ) { | |
$Stopwatch.Stop() | |
Write-Host ("Full completion time: {0}" -f $Stopwatch.Elapsed) | |
} | |
} | |
if ( $EnableLogging ) { | |
Stop-Transcript | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment