$ErrorActionPreference = 'Stop' [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 #region Variables $spicetifyFolderPath = "$env:LOCALAPPDATA\spicetify" $spicetifyOldFolderPath = "$HOME\spicetify-cli" #endregion Variables #region Functions function Write-Success { [CmdletBinding()] param () process { Write-Host -Object ' > OK' -ForegroundColor 'Green' } } function Write-Unsuccess { [CmdletBinding()] param () process { Write-Host -Object ' > ERROR' -ForegroundColor 'Red' } } function Test-Admin { [CmdletBinding()] param () begin { Write-Host -Object "Checking if the script wasn't ran as Administrator..." -NoNewline } process { $currentUser = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) -not $currentUser.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) } } function Test-PowerShellVersion { [CmdletBinding()] param () begin { $PSMinVersion = [version]'5.1' } process { Write-Host -Object 'Checking if your PowerShell version is compatible...' -NoNewline $PSVersionTable.PSVersion -ge $PSMinVersion } } function Move-OldSpicetifyFolder { [CmdletBinding()] param () process { if (Test-Path -Path $spicetifyOldFolderPath) { Write-Host -Object 'Moving the old spicetify folder...' -NoNewline Copy-Item -Path "$spicetifyOldFolderPath\*" -Destination $spicetifyFolderPath -Recurse -Force Remove-Item -Path $spicetifyOldFolderPath -Recurse -Force Write-Success } } } function Get-Spicetify { [CmdletBinding()] param () begin { if ($env:PROCESSOR_ARCHITECTURE -eq 'AMD64') { $architecture = 'x64' } elseif ($env:PROCESSOR_ARCHITECTURE -eq 'ARM64') { $architecture = 'arm64' } else { $architecture = 'x32' } if ($v) { if ($v -match '^\d+\.\d+\.\d+$') { $targetVersion = $v } else { Write-Warning -Message "You have spicefied an invalid spicetify version: $v `nThe version must be in the following format: 1.2.3" Pause exit } } else { Write-Host -Object 'Fetching the latest spicetify version...' -NoNewline $latestRelease = Invoke-RestMethod -Uri 'https://api.github.com/repos/spicetify/spicetify-cli/releases/latest' $targetVersion = $latestRelease.tag_name -replace 'v', '' Write-Success } $archivePath = "$env:TEMP\spicetify.zip" } process { Write-Host -Object "Downloading spicetify v$targetVersion..." -NoNewline $Parameters = @{ Uri = "https://github.com/spicetify/spicetify-cli/releases/download/v$targetVersion/spicetify-$targetVersion-windows-$architecture.zip" UseBasicParsin = $true OutFile = $archivePath } Invoke-WebRequest @Parameters Write-Success } end { $archivePath } } function Add-SpicetifyToPath { [CmdletBinding()] param () begin { Write-Host -Object 'Making spicetify available in the PATH...' -NoNewline $user = [EnvironmentVariableTarget]::User $path = [Environment]::GetEnvironmentVariable('PATH', $user) } process { $path = $path -replace "$([regex]::Escape($spicetifyOldFolderPath))\\*;*", '' if ($path -notlike "*$spicetifyFolderPath*") { $path = "$path;$spicetifyFolderPath" } } end { [Environment]::SetEnvironmentVariable('PATH', $path, $user) $env:PATH = $path Write-Success } } function Install-Spicetify { [CmdletBinding()] param () begin { Write-Host -Object 'Installing spicetify...' } process { $archivePath = Get-Spicetify Write-Host -Object 'Extracting spicetify...' -NoNewline Expand-Archive -Path $archivePath -DestinationPath $spicetifyFolderPath -Force Write-Success Add-SpicetifyToPath } end { Remove-Item -Path $archivePath -Force -ErrorAction 'SilentlyContinue' Write-Host -Object 'spicetify was successfully installed!' -ForegroundColor 'Green' } } #endregion Functions #region Main #region Checks if (-not (Test-PowerShellVersion)) { Write-Unsuccess Write-Warning -Message 'PowerShell 5.1 or higher is required to run this script' Write-Warning -Message "You are running PowerShell $($PSVersionTable.PSVersion)" Write-Host -Object 'PowerShell 5.1 install guide:' Write-Host -Object 'https://learn.microsoft.com/skypeforbusiness/set-up-your-computer-for-windows-powershell/download-and-install-windows-powershell-5-1' Write-Host -Object 'PowerShell 7 install guide:' Write-Host -Object 'https://learn.microsoft.com/powershell/scripting/install/installing-powershell-on-windows' Pause exit } else { Write-Success } if (-not (Test-Admin)) { Write-Unsuccess Write-Warning -Message "The script was ran as Administrator which isn't recommended" $Host.UI.RawUI.Flushinputbuffer() $choices = [System.Management.Automation.Host.ChoiceDescription[]] @( (New-Object System.Management.Automation.Host.ChoiceDescription '&Yes', 'Abort installation.'), (New-Object System.Management.Automation.Host.ChoiceDescription '&No', 'Resume installation.') ) $choice = $Host.UI.PromptForChoice('', 'Do you want to abort the installation process to avoid any issues?', $choices, 0) if ($choice -eq 0) { Write-Host -Object 'spicetify installation aborted' -ForegroundColor 'Yellow' Pause exit } } else { Write-Success } #endregion Checks #region Spicetify Move-OldSpicetifyFolder Install-Spicetify Write-Host -Object "`nRun" -NoNewline Write-Host -Object ' spicetify -h ' -NoNewline -ForegroundColor 'Cyan' Write-Host -Object 'to get started' #endregion Spicetify #region Marketplace $Host.UI.RawUI.Flushinputbuffer() $choices = [System.Management.Automation.Host.ChoiceDescription[]] @( (New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Install Spicetify Marketplace."), (New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Do not install Spicetify Marketplace.") ) $choice = $Host.UI.PromptForChoice('', "`nDo you want to install Spicetify Marketplace?", $choices, 0) if ($choice -eq 1) { Write-Host -Object 'spicetify Marketplace installation aborted' -ForegroundColor 'Yellow' } else { Write-Host -Object 'Starting the spicetify Marketplace installation script..' $Parameters = @{ Uri = 'https://raw.githubusercontent.com/spicetify/spicetify-marketplace/main/resources/install.ps1' UseBasicParsing = $true } Invoke-WebRequest @Parameters | Invoke-Expression } #endregion Marketplace #endregion Main