123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- # Check for admin rights and handle elevation
- $isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")
- if (-NOT $isAdmin) {
- # Detect PowerShell version and path
- $pwshPath = if (Get-Command "pwsh" -ErrorAction SilentlyContinue) {
- (Get-Command "pwsh").Source # PowerShell 7+
- } elseif (Test-Path "$env:ProgramFiles\PowerShell\7\pwsh.exe") {
- "$env:ProgramFiles\PowerShell\7\pwsh.exe"
- } else {
- "powershell.exe" # Windows PowerShell
- }
-
- try {
- Write-Host "`nRequesting administrator privileges..." -ForegroundColor Cyan
- $scriptPath = $MyInvocation.MyCommand.Path
- $argList = "-NoProfile -ExecutionPolicy Bypass -File `"$scriptPath`""
- Start-Process -FilePath $pwshPath -Verb RunAs -ArgumentList $argList -Wait
- exit
- }
- catch {
- Write-Host "`nError: Administrator privileges required" -ForegroundColor Red
- Write-Host "Please run this script from an Administrator PowerShell window" -ForegroundColor Yellow
- Write-Host "`nTo do this:" -ForegroundColor Cyan
- Write-Host "1. Press Win + X" -ForegroundColor White
- Write-Host "2. Click 'Windows Terminal (Admin)' or 'PowerShell (Admin)'" -ForegroundColor White
- Write-Host "3. Run the installation command again" -ForegroundColor White
- Write-Host "`nPress enter to exit..."
- $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
- exit 1
- }
- }
- # Set TLS to 1.2
- [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
- # Create temporary directory
- $TmpDir = Join-Path $env:TEMP ([System.Guid]::NewGuid().ToString())
- New-Item -ItemType Directory -Path $TmpDir | Out-Null
- # Cleanup function
- function Cleanup {
- if (Test-Path $TmpDir) {
- Remove-Item -Recurse -Force $TmpDir
- }
- }
- # Error handler
- trap {
- Write-Host "Error: $_" -ForegroundColor Red
- Cleanup
- Write-Host "Press enter to exit..."
- $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
- exit 1
- }
- # Detect system architecture
- function Get-SystemArch {
- if ([Environment]::Is64BitOperatingSystem) {
- return "x86_64"
- } else {
- return "i386"
- }
- }
- # Download with progress
- function Get-FileWithProgress {
- param (
- [string]$Url,
- [string]$OutputFile
- )
-
- try {
- $webClient = New-Object System.Net.WebClient
- $webClient.Headers.Add("User-Agent", "PowerShell Script")
-
- $webClient.DownloadFile($Url, $OutputFile)
- return $true
- }
- catch {
- Write-Host "Failed to download: $_" -ForegroundColor Red
- return $false
- }
- }
- # Main installation function
- function Install-CursorModifier {
- Write-Host "Starting installation..." -ForegroundColor Cyan
-
- # Detect architecture
- $arch = Get-SystemArch
- Write-Host "Detected architecture: $arch" -ForegroundColor Green
-
- # Set installation directory
- $InstallDir = "$env:ProgramFiles\CursorModifier"
- if (!(Test-Path $InstallDir)) {
- New-Item -ItemType Directory -Path $InstallDir | Out-Null
- }
-
- # Get latest release
- try {
- $latestRelease = Invoke-RestMethod -Uri "https://api.github.com/repos/yuaotian/go-cursor-help/releases/latest"
- Write-Host "Found latest release: $($latestRelease.tag_name)" -ForegroundColor Cyan
-
- # Look for Windows binary with our architecture
- $version = $latestRelease.tag_name.TrimStart('v')
- Write-Host "Version: $version" -ForegroundColor Cyan
- $possibleNames = @(
- "cursor-id-modifier_${version}_windows_x86_64.exe",
- "cursor-id-modifier_${version}_windows_$($arch).exe"
- )
-
- $asset = $null
- foreach ($name in $possibleNames) {
- Write-Host "Checking for asset: $name" -ForegroundColor Cyan
- $asset = $latestRelease.assets | Where-Object { $_.name -eq $name }
- if ($asset) {
- Write-Host "Found matching asset: $($asset.name)" -ForegroundColor Green
- break
- }
- }
-
- if (!$asset) {
- Write-Host "`nAvailable assets:" -ForegroundColor Yellow
- $latestRelease.assets | ForEach-Object { Write-Host "- $($_.name)" }
- throw "Could not find appropriate Windows binary for $arch architecture"
- }
-
- $downloadUrl = $asset.browser_download_url
- }
- catch {
- Write-Host "Failed to get latest release: $_" -ForegroundColor Red
- exit 1
- }
-
- # Download binary
- Write-Host "`nDownloading latest release..." -ForegroundColor Cyan
- $binaryPath = Join-Path $TmpDir "cursor-id-modifier.exe"
-
- if (!(Get-FileWithProgress -Url $downloadUrl -OutputFile $binaryPath)) {
- exit 1
- }
-
- # Install binary
- Write-Host "Installing..." -ForegroundColor Cyan
- try {
- Copy-Item -Path $binaryPath -Destination "$InstallDir\cursor-id-modifier.exe" -Force
-
- # Add to PATH if not already present
- $currentPath = [Environment]::GetEnvironmentVariable("Path", "Machine")
- if ($currentPath -notlike "*$InstallDir*") {
- [Environment]::SetEnvironmentVariable("Path", "$currentPath;$InstallDir", "Machine")
- }
- }
- catch {
- Write-Host "Failed to install: $_" -ForegroundColor Red
- exit 1
- }
-
- Write-Host "Installation completed successfully!" -ForegroundColor Green
- Write-Host "Running cursor-id-modifier..." -ForegroundColor Cyan
-
- # Run the program
- try {
- & "$InstallDir\cursor-id-modifier.exe"
- if ($LASTEXITCODE -ne 0) {
- Write-Host "Failed to run cursor-id-modifier" -ForegroundColor Red
- exit 1
- }
- }
- catch {
- Write-Host "Failed to run cursor-id-modifier: $_" -ForegroundColor Red
- exit 1
- }
- }
- # Run installation
- try {
- Install-CursorModifier
- }
- catch {
- Write-Host "Installation failed: $_" -ForegroundColor Red
- Cleanup
- Write-Host "Press enter to exit..."
- $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
- exit 1
- }
- finally {
- Cleanup
- if ($LASTEXITCODE -ne 0) {
- Write-Host "Press enter to exit..." -ForegroundColor Green
- $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
- }
- }
|