From b39c1c64f46685751b70451d69a1ef421cba1246 Mon Sep 17 00:00:00 2001 From: Nicole Rappe Date: Sat, 12 Apr 2025 05:48:44 -0600 Subject: [PATCH] Added Automated NodeJS & Python Install Script --- Launch-Borealis.ps1 | 2 +- Prerequisites-Installer-(RunAsAdmin).ps1 | 131 +++++++++++++++++++++++ 2 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 Prerequisites-Installer-(RunAsAdmin).ps1 diff --git a/Launch-Borealis.ps1 b/Launch-Borealis.ps1 index 23114ac..fedd6b2 100644 --- a/Launch-Borealis.ps1 +++ b/Launch-Borealis.ps1 @@ -8,7 +8,7 @@ It begins by presenting a menu to the user. Based on the selection (1 or 2), the corresponding module is launched. Usage: - Set-ExecutionPolicy Unrestricted -Scope Process; .\Deploy-Borealis.ps1 + Set-ExecutionPolicy Unrestricted -Scope Process; .\Launch-Borealis.ps1 #> # ---------------------- Common Initialization & Visuals ---------------------- diff --git a/Prerequisites-Installer-(RunAsAdmin).ps1 b/Prerequisites-Installer-(RunAsAdmin).ps1 new file mode 100644 index 0000000..aeeb907 --- /dev/null +++ b/Prerequisites-Installer-(RunAsAdmin).ps1 @@ -0,0 +1,131 @@ +<# + Python-NodeJS-Installer.ps1 + ----------------------------------- + Silently installs Python 3.13.3 and Node.js 23.11.0, + replaces PATH to avoid Windows Store shim issue, + and ensures persistence across reboots. + + REQUIREMENT: + Must be run from an Administrator PowerShell session. + + Usage: + Set-ExecutionPolicy Unrestricted -Scope Process; .\Python-NodeJS-Installer.ps1 +#> + +$ErrorActionPreference = "Stop" + +# ----------- ADMIN WARNING AND PAUSE ----------- +Write-Host "=================================================================" -ForegroundColor Yellow +Write-Host " WARNING: This script must be run as Administrator to function." -ForegroundColor Yellow +Write-Host " It will modify the system PATH (User and Machine scopes) and install tools globally." -ForegroundColor Yellow +Write-Host "=================================================================" -ForegroundColor Yellow +Pause +Write-Host "" + +# ----------- Install URLs and Paths ----------- +$pythonURL = "https://www.python.org/ftp/python/3.13.3/python-3.13.3-amd64.exe" +$nodeURL = "https://nodejs.org/dist/latest/node-v23.11.0-x64.msi" + +$tempDir = $env:TEMP +$pythonInstaller = Join-Path $tempDir "python-installer.exe" +$nodeInstaller = Join-Path $tempDir "node-setup.msi" + +$realPythonPath = "C:\Program Files\Python313" +$realPythonExe = "$realPythonPath\python.exe" +$realScriptsPath = "$realPythonPath\Scripts" + +# ----------- PATH Cleanup Function ----------- +function Clean-PythonFromPath { + Write-Host "[INFO] Cleaning existing Python paths from system and user PATH..." + + $scopes = @([EnvironmentVariableTarget]::User, [EnvironmentVariableTarget]::Machine) + + foreach ($scope in $scopes) { + $originalPath = [Environment]::GetEnvironmentVariable("Path", $scope) + if (-not $originalPath) { continue } + + $cleaned = $originalPath -split ";" | Where-Object { + ($_ -notmatch "WindowsApps") -and ($_ -notmatch "Python") -and ($_ -notmatch "Python3") + } + + $newPath = ($cleaned -join ";").TrimEnd(";") + + [Environment]::SetEnvironmentVariable("Path", $newPath, $scope) + Write-Host "[OK] Cleaned Python-related entries from $scope PATH" + } +} + +# ----------- Global PATH Modification ----------- +function Set-PersistentPath { + param ( + [string]$TargetPath + ) + + $scope = [EnvironmentVariableTarget]::Machine + $currentPath = [Environment]::GetEnvironmentVariable("Path", $scope) + + $filtered = $currentPath -split ";" | Where-Object { + ($_ -notmatch "WindowsApps") -and ($_ -notmatch "Python") + } + + $newPath = ($filtered + $TargetPath + "$TargetPath\Scripts") -join ";" + [Environment]::SetEnvironmentVariable("Path", $newPath, $scope) + + Write-Host "[OK] System PATH updated with: $TargetPath" +} + +# ----------- Install Python ----------- +function Install-Python { + if (Test-Path $realPythonExe) { + Write-Host "[OK] Python already installed at $realPythonPath" + Set-PersistentPath -TargetPath $realPythonPath + return + } + + Write-Host "[INFO] Downloading Python installer..." + Invoke-WebRequest -Uri $pythonURL -OutFile $pythonInstaller + + Write-Host "[INFO] Installing Python silently..." + Start-Process -FilePath $pythonInstaller -ArgumentList '/quiet InstallAllUsers=1 PrependPath=1 Include_test=0' -Wait + + Remove-Item $pythonInstaller -Force + + if (Test-Path $realPythonExe) { + Write-Host "[OK] Python installed at $realPythonPath" + Set-PersistentPath -TargetPath $realPythonPath + } else { + Write-Host "[ERROR] Python install failed or path not found." -ForegroundColor Red + exit 1 + } +} + +# ----------- Install NodeJS ----------- +function Install-NodeJS { + if (Get-Command node -ErrorAction SilentlyContinue) { + Write-Host "[OK] Node.js is already installed." + return + } + + Write-Host "[INFO] Downloading Node.js installer..." + Invoke-WebRequest -Uri $nodeURL -OutFile $nodeInstaller + + Write-Host "[INFO] Installing Node.js silently..." + Start-Process -FilePath "msiexec.exe" -ArgumentList "/i `"$nodeInstaller`" /qn /norestart" -Wait + + Remove-Item $nodeInstaller -Force + Write-Host "[OK] Node.js installed." +} + +# ----------- Main Script ----------- +Write-Host "==============================================" +Write-Host " Python + NodeJS Installer for Borealis" +Write-Host "==============================================" +Write-Host "" + +Clean-PythonFromPath +Install-Python +Install-NodeJS + +Write-Host "" +Write-Host "[OK] All dependencies installed and system PATH updated." +Write-Host "You can now run Launch-Borealis.ps1 in a new PowerShell window."