Spaces:
Paused
Paused
| #Requires -RunAsAdministrator | |
| <# | |
| .SYNOPSIS | |
| Fixes Node.js installation issues caused by Windows TEMP permission problems. | |
| .DESCRIPTION | |
| This script: | |
| 1. Fixes C:\Windows\TEMP permissions (root cause of MSI Error 1157) | |
| 2. Uninstalls existing Node.js installation | |
| 3. Cleans up leftover files | |
| 4. Reinstalls Node.js LTS via Chocolatey | |
| .NOTES | |
| Run this script as Administrator! | |
| Close VS Code and other applications using Node before running. | |
| #> | |
| $ErrorActionPreference = "Continue" | |
| Write-Host "========================================" -ForegroundColor Cyan | |
| Write-Host " Node.js Installation Fix Script" -ForegroundColor Cyan | |
| Write-Host "========================================" -ForegroundColor Cyan | |
| Write-Host "" | |
| # Check if running as admin | |
| $isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) | |
| if (-not $isAdmin) { | |
| Write-Host "ERROR: This script must be run as Administrator!" -ForegroundColor Red | |
| Write-Host "Right-click PowerShell and select 'Run as Administrator'" -ForegroundColor Yellow | |
| exit 1 | |
| } | |
| # Step 1: Fix Windows\TEMP permissions | |
| Write-Host "[1/7] Fixing C:\Windows\TEMP permissions..." -ForegroundColor Yellow | |
| icacls "C:\Windows\TEMP" /grant "SYSTEM:(OI)(CI)F" /T 2>$null | |
| icacls "C:\Windows\TEMP" /grant "Administrators:(OI)(CI)F" /T 2>$null | |
| icacls "C:\Windows\TEMP" /grant "Users:(OI)(CI)(M)" /T 2>$null | |
| Write-Host " Done." -ForegroundColor Green | |
| # Step 2: Stop Node processes | |
| Write-Host "[2/7] Stopping Node processes..." -ForegroundColor Yellow | |
| $nodeProcs = Get-Process -Name "node" -ErrorAction SilentlyContinue | |
| if ($nodeProcs) { | |
| Stop-Process -Name "node" -Force -ErrorAction SilentlyContinue | |
| Write-Host " Stopped $($nodeProcs.Count) process(es)." -ForegroundColor Green | |
| } else { | |
| Write-Host " No Node processes running." -ForegroundColor Green | |
| } | |
| # Step 3: Reset Windows Installer service | |
| Write-Host "[3/7] Resetting Windows Installer service..." -ForegroundColor Yellow | |
| net stop msiserver 2>$null | |
| Start-Sleep -Seconds 2 | |
| net start msiserver 2>$null | |
| Write-Host " Done." -ForegroundColor Green | |
| # Step 4: Uninstall existing Node via MSI | |
| Write-Host "[4/7] Uninstalling existing Node.js via MSI..." -ForegroundColor Yellow | |
| $nodeProduct = Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*" -ErrorAction SilentlyContinue | | |
| Where-Object { $_.DisplayName -eq "Node.js" } | |
| if ($nodeProduct) { | |
| $productCode = $nodeProduct.PSChildName | |
| Write-Host " Found Node.js with product code: $productCode" -ForegroundColor Gray | |
| $process = Start-Process -FilePath "msiexec.exe" -ArgumentList "/x $productCode /qn" -Wait -PassThru | |
| if ($process.ExitCode -eq 0 -or $process.ExitCode -eq 1605) { | |
| Write-Host " Uninstalled successfully." -ForegroundColor Green | |
| } else { | |
| Write-Host " MSI uninstall returned code: $($process.ExitCode)" -ForegroundColor Yellow | |
| } | |
| Start-Sleep -Seconds 5 | |
| } else { | |
| Write-Host " No MSI installation found." -ForegroundColor Gray | |
| } | |
| # Step 5: Clean up files | |
| Write-Host "[5/7] Cleaning up leftover files..." -ForegroundColor Yellow | |
| $paths = @( | |
| "C:\Program Files\nodejs", | |
| "$env:APPDATA\npm", | |
| "$env:APPDATA\npm-cache", | |
| "$env:LOCALAPPDATA\npm-cache" | |
| ) | |
| foreach ($path in $paths) { | |
| if (Test-Path $path) { | |
| Remove-Item $path -Recurse -Force -ErrorAction SilentlyContinue | |
| Write-Host " Removed: $path" -ForegroundColor Gray | |
| } | |
| } | |
| Write-Host " Done." -ForegroundColor Green | |
| # Step 6: Clean Chocolatey packages | |
| Write-Host "[6/7] Cleaning Chocolatey packages..." -ForegroundColor Yellow | |
| choco uninstall nodejs nodejs-lts nodejs.install -y --force 2>$null | Out-Null | |
| Remove-Item "C:\ProgramData\chocolatey\lib\nodejs*" -Recurse -Force -ErrorAction SilentlyContinue | |
| Write-Host " Done." -ForegroundColor Green | |
| # Step 7: Install Node.js LTS | |
| Write-Host "[7/7] Installing Node.js LTS via Chocolatey..." -ForegroundColor Yellow | |
| choco install nodejs-lts -y | |
| # Verify installation | |
| Write-Host "" | |
| Write-Host "========================================" -ForegroundColor Cyan | |
| Write-Host " Verification" -ForegroundColor Cyan | |
| Write-Host "========================================" -ForegroundColor Cyan | |
| # Refresh PATH | |
| $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") | |
| $nodeVersion = & "C:\Program Files\nodejs\node.exe" --version 2>$null | |
| $npmVersion = & "C:\Program Files\nodejs\npm.cmd" --version 2>$null | |
| if ($nodeVersion) { | |
| Write-Host "Node.js: $nodeVersion" -ForegroundColor Green | |
| Write-Host "npm: $npmVersion" -ForegroundColor Green | |
| Write-Host "" | |
| Write-Host "SUCCESS! Node.js is now installed." -ForegroundColor Green | |
| } else { | |
| Write-Host "WARNING: Could not verify Node.js installation." -ForegroundColor Yellow | |
| Write-Host "Please restart your terminal and run 'node --version'" -ForegroundColor Yellow | |
| } | |
| Write-Host "" | |
| Write-Host "NOTE: You may need to restart your terminal for PATH changes." -ForegroundColor Cyan | |