126 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PowerShell
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PowerShell
		
	
	
		
			Executable File
		
	
	
	
	
| # Copyright (c) Microsoft Corporation.
 | |
| # SPDX-License-Identifier: MIT
 | |
| 
 | |
| <#
 | |
| .SYNOPSIS
 | |
| Gets a random file path in the temp directory.
 | |
| 
 | |
| .DESCRIPTION
 | |
| Get-TempFilePath takes an extension, and returns a path with a random
 | |
| filename component in the temporary directory with that extension.
 | |
| 
 | |
| .PARAMETER Extension
 | |
| The extension to use for the path.
 | |
| #>
 | |
| Function Get-TempFilePath {
 | |
|   Param(
 | |
|     [String]$Extension
 | |
|   )
 | |
| 
 | |
|   if ([String]::IsNullOrWhiteSpace($Extension)) {
 | |
|     throw 'Missing Extension'
 | |
|   }
 | |
| 
 | |
|   $tempPath = [System.IO.Path]::GetTempPath()
 | |
|   $tempName = [System.IO.Path]::GetRandomFileName() + '.' + $Extension
 | |
|   return Join-Path $tempPath $tempName
 | |
| }
 | |
| 
 | |
| <#
 | |
| .SYNOPSIS
 | |
| Writes a message to the screen depending on ExitCode.
 | |
| 
 | |
| .DESCRIPTION
 | |
| Since msiexec can return either 0 or 3010 successfully, in both cases
 | |
| we write that installation succeeded, and which exit code it exited with.
 | |
| If msiexec returns anything else, we write an error.
 | |
| 
 | |
| .PARAMETER ExitCode
 | |
| The exit code that msiexec returned.
 | |
| #>
 | |
| Function PrintMsiExitCodeMessage {
 | |
|   Param(
 | |
|     $ExitCode
 | |
|   )
 | |
| 
 | |
|   # 3010 is probably ERROR_SUCCESS_REBOOT_REQUIRED
 | |
|   if ($ExitCode -eq 0 -or $ExitCode -eq 3010) {
 | |
|     Write-Host "Installation successful! Exited with $ExitCode."
 | |
|   }
 | |
|   else {
 | |
|     Write-Error "Installation failed! Exited with $ExitCode."
 | |
|     throw
 | |
|   }
 | |
| }
 | |
| 
 | |
| <#
 | |
| .SYNOPSIS
 | |
| Install a .msi file.
 | |
| 
 | |
| .DESCRIPTION
 | |
| InstallMSI takes a url where an .msi lives, and installs that .msi to the system.
 | |
| 
 | |
| .PARAMETER Name
 | |
| The name of the thing to install.
 | |
| 
 | |
| .PARAMETER Url
 | |
| The URL at which the .msi lives.
 | |
| #>
 | |
| Function InstallMSI {
 | |
|   Param(
 | |
|     [String]$Name,
 | |
|     [String]$Url
 | |
|   )
 | |
| 
 | |
|   try {
 | |
|     Write-Host "Downloading $Name..."
 | |
|     [string]$msiPath = Get-TempFilePath -Extension 'msi'
 | |
|     curl.exe -L -o $msiPath -s -S $Url
 | |
|     Write-Host "Installing $Name..."
 | |
|     $args = @('/i', $msiPath, '/norestart', '/quiet', '/qn')
 | |
|     $proc = Start-Process -FilePath 'msiexec.exe' -ArgumentList $args -Wait -PassThru
 | |
|     PrintMsiExitCodeMessage $proc.ExitCode
 | |
|   }
 | |
|   catch {
 | |
|     Write-Error "Failed to install $Name! $($_.Exception.Message)"
 | |
|     throw
 | |
|   }
 | |
| }
 | |
| 
 | |
| <#
 | |
| .SYNOPSIS
 | |
| Unpacks a zip file to $Dir.
 | |
| 
 | |
| .DESCRIPTION
 | |
| InstallZip takes a URL of a zip file, and unpacks the zip file to the directory
 | |
| $Dir.
 | |
| 
 | |
| .PARAMETER Name
 | |
| The name of the tool being installed.
 | |
| 
 | |
| .PARAMETER Url
 | |
| The URL of the zip file to unpack.
 | |
| 
 | |
| .PARAMETER Dir
 | |
| The directory to unpack the zip file to.
 | |
| #>
 | |
| Function InstallZip {
 | |
|   Param(
 | |
|     [String]$Name,
 | |
|     [String]$Url,
 | |
|     [String]$Dir
 | |
|   )
 | |
| 
 | |
|   try {
 | |
|     Write-Host "Downloading $Name..."
 | |
|     [string]$zipPath = Get-TempFilePath -Extension 'zip'
 | |
|     curl.exe -L -o $zipPath -s -S $Url
 | |
|     Write-Host "Installing $Name..."
 | |
|     Expand-Archive -Path $zipPath -DestinationPath $Dir -Force
 | |
|   }
 | |
|   catch {
 | |
|     Write-Error "Failed to install $Name! $($_.Exception.Message)"
 | |
|     throw
 | |
|   }
 | |
| }
 |