@@ -9,6 +9,11 @@ $REPO = "Trirrin/Tricode-cli"
99$INSTALL_DIR = " $env: LOCALAPPDATA \Tricode"
1010$GITHUB_API = " https://api.github.com/repos/$REPO /releases/latest"
1111
12+ # Try to ensure TLS1.2 for older systems
13+ try {
14+ [Net.ServicePointManager ]::SecurityProtocol = [Net.ServicePointManager ]::SecurityProtocol -bor [Net.SecurityProtocolType ]::Tls12
15+ } catch {}
16+
1217# ==== TEXTS 说明文本(EN/中)====
1318$TEXT_START = " Installing Tricode-cli..."
1419$TEXT_DOWNLOAD = " Downloading the latest release..."
@@ -42,37 +47,54 @@ function Write-Error-Exit {
4247# ==== MAIN 主流程 ====
4348Write-Info $TEXT_START
4449
45- # 1. Detect Architecture 检测架构
46- $ARCH = $env: PROCESSOR_ARCHITECTURE
47- Write-Host " Detected Architecture: $ARCH "
50+ # 1. Detect Architecture 检测架构(兼容 32 位 PowerShell)
51+ $archRaw = $env: PROCESSOR_ARCHITECTURE
52+ $archWow = $env: PROCESSOR_ARCHITEW6432
53+ $isArm64 = ($archRaw -match ' ARM64' ) -or ($archWow -match ' ARM64' )
54+ $is64OS = [Environment ]::Is64BitOperatingSystem
55+ Write-Host " Detected Architecture: raw=$archRaw , wow64=$archWow , is64OS=$is64OS "
4856
49- if ($ARCH -eq " AMD64" -or $ARCH -eq " x64" ) {
50- $ASSET_ARCH = " windows-x86_64"
51- } elseif ($ARCH -eq " ARM64" ) {
57+ if ($isArm64 ) {
5258 $ASSET_ARCH = " windows-arm64"
59+ } elseif ($is64OS ) {
60+ $ASSET_ARCH = " windows-x86_64"
5361} else {
54- Write-Error - Exit " Unsupported architecture: $ARCH "
62+ Write-Error - Exit " Unsupported architecture or 32-bit OS is not supported. "
5563}
5664
57- Write-Host " Looking for release: tricode- $ASSET_ARCH .exe"
65+ Write-Host " Looking for release asset matching: $ASSET_ARCH ( .exe preferred) "
5866
59- # 2. Get download URL from GitHub API 通过GitHub API获取下载链接
67+ # 2. Get download URL from GitHub API 通过 GitHub API 获取下载链接
6068Write-Info $TEXT_DOWNLOAD
6169
6270try {
63- $API_RESPONSE = Invoke-RestMethod - Uri $GITHUB_API - ErrorAction Stop
71+ $headers = @ { ' User-Agent' = ' tricode-installer' }
72+ $API_RESPONSE = Invoke-RestMethod - Uri $GITHUB_API - Headers $headers - ErrorAction Stop
6473} catch {
6574 Write-Error - Exit " Cannot connect to GitHub API. Please check your network.`n Error: $_ " 2
6675}
6776
68- $ASSET_URL = $API_RESPONSE.assets | Where-Object { $_.name -like " *$ASSET_ARCH *" } | Select-Object - First 1 - ExpandProperty browser_download_url
77+ # Prefer .exe; fallback to .zip; only match files containing the arch and with .exe/.zip suffix
78+ $assets = @ ($API_RESPONSE.assets )
79+ if (-not $assets -or $assets.Count -eq 0 ) {
80+ Write-Error - Exit " No assets found in latest release." 2
81+ }
82+
83+ $archPattern = [Regex ]::Escape($ASSET_ARCH )
84+ $exeCandidates = $assets | Where-Object { $_.name -match " (?i)$archPattern .*\.exe$" }
85+ $zipCandidates = $assets | Where-Object { $_.name -match " (?i)$archPattern .*\.zip$" }
86+
87+ $asset = $null
88+ if ($exeCandidates ) { $asset = $exeCandidates | Select-Object - First 1 }
89+ elseif ($zipCandidates ) { $asset = $zipCandidates | Select-Object - First 1 }
6990
70- if (-not $ASSET_URL ) {
91+ if (-not $asset ) {
7192 Write-Host " Debug: Available assets:" - ForegroundColor Yellow
72- $API_RESPONSE . assets | ForEach-Object { Write-Host " - $ ( $_.name ) " }
73- Write-Error - Exit " Cannot find matching release binary for tricode- $ASSET_ARCH .exe`n Please check if the release exists at : https://github.com/$REPO /releases" 2
93+ $assets | ForEach-Object { Write-Host " - $ ( $_.name ) " }
94+ Write-Error - Exit " Cannot find matching release binary for $ASSET_ARCH ( .exe or .zip). `n Please check: https://github.com/$REPO /releases" 2
7495}
7596
97+ $ASSET_URL = $asset.browser_download_url
7698Write-Host " Downloading from: $ASSET_URL "
7799
78100# 3. Download binary 下载二进制文件
@@ -81,7 +103,7 @@ New-Item -ItemType Directory -Path $TMP_DIR -Force | Out-Null
81103
82104try {
83105 $DOWNLOAD_FILE = Join-Path $TMP_DIR (Split-Path $ASSET_URL - Leaf)
84- Invoke-WebRequest - Uri $ASSET_URL - OutFile $DOWNLOAD_FILE - ErrorAction Stop
106+ Invoke-WebRequest - Uri $ASSET_URL - OutFile $DOWNLOAD_FILE - UseBasicParsing - ErrorAction Stop
85107} catch {
86108 Write-Error - Exit " Failed to download binary.`n Error: $_ " 3
87109}
@@ -115,24 +137,44 @@ try {
115137 Write-Error - Exit " Failed to copy binary to $INSTALL_DIR `n Error: $_ " 5
116138}
117139
118- # 6. Add to PATH 添加到PATH
140+ # 6. Add to PATH 添加到 PATH(去重、规范化、无多余分号)
119141Write-Info $TEXT_PATH
120142
121143$USER_PATH = [Environment ]::GetEnvironmentVariable(" Path" , " User" )
144+ $normalizedInstall = $INSTALL_DIR.TrimEnd (' \\' )
122145
123- if ($USER_PATH -notlike " *$INSTALL_DIR *" ) {
146+ $parts = @ ()
147+ if ($null -ne $USER_PATH -and $USER_PATH -ne ' ' ) {
148+ $parts = $USER_PATH -split ' ;' | Where-Object { $_ -and $_ -ne ' ' }
149+ }
150+
151+ $exists = $false
152+ foreach ($p in $parts ) {
153+ if ($p.Trim ().TrimEnd(' \\' ) -ieq $normalizedInstall ) { $exists = $true ; break }
154+ }
155+
156+ if (-not $exists ) {
124157 try {
125- $NEW_PATH = " $USER_PATH ;$INSTALL_DIR "
158+ $cleanParts = @ ()
159+ foreach ($p in $parts ) {
160+ $pp = $p.Trim ()
161+ if ($pp -ne ' ' ) { $cleanParts += $pp }
162+ }
163+ $cleanParts += $normalizedInstall
164+ $NEW_PATH = ($cleanParts ) -join ' ;'
126165 [Environment ]::SetEnvironmentVariable(" Path" , $NEW_PATH , " User" )
127- Write-Host " Added $INSTALL_DIR to User PATH"
128-
129- # Update current session PATH
130- $env: Path = " $env: Path ;$INSTALL_DIR "
166+ Write-Host " Added $normalizedInstall to User PATH"
167+
168+ # Update current session PATH(若当前会话不存在则追加)
169+ $sessionHas = $false
170+ $sessionParts = ($env: Path -split ' ;' )
171+ foreach ($sp in $sessionParts ) { if ($sp.Trim ().TrimEnd(' \\' ) -ieq $normalizedInstall ) { $sessionHas = $true ; break } }
172+ if (-not $sessionHas ) { $env: Path = " $env: Path ;$normalizedInstall " }
131173 } catch {
132- Write-Warning " Failed to add to PATH automatically. Please add manually:`n $INSTALL_DIR "
174+ Write-Warning " Failed to add to PATH automatically. Please add manually:`n $normalizedInstall "
133175 }
134176} else {
135- Write-Host " $INSTALL_DIR is already in PATH"
177+ Write-Host " $normalizedInstall is already in PATH"
136178}
137179
138180# 7. Cleanup 清理
@@ -148,3 +190,4 @@ if (Test-Path "$INSTALL_DIR\tricode.exe") {
148190} else {
149191 Write-Warning " Installation may have issues. Binary not found."
150192}
193+
0 commit comments