Files
Clash/install.ps1
T
lukeopen 551ff9c4c9 fix: 修复 Windows 部署 install.ps1 解压 bug + reload 鉴权
- install.ps1: 官方 zip 内 exe 名为 mihomo-windows-amd64-v1.exe,
  改为匹配 *.exe + mihomo* 前缀,不再硬找 mihomo.exe
- clash.ps1: 热重载 PUT /configs 补上 secret Bearer 鉴权,
  避免开启 secret 后 reload 一直 401 退化成重启
2026-08-11 09:53:43 +08:00

226 lines
7.9 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env pwsh
# ═══════════════════════════════════════════════════════════
# Mihomo Kernel Manager — Windows 一键部署脚本
# 用法: pwsh install.ps1
# ═══════════════════════════════════════════════════════════
$ErrorActionPreference = "Stop"
$ProgressPreference = "SilentlyContinue"
# ─── 版本 ───
$MihomoVersion = "v1.19.15"
$WintunVersion = "0.14.1"
# ─── 路径 ───
$InstallDir = "$env:LOCALAPPDATA\Programs\mihomo"
$ConfigDir = "$env:USERPROFILE\.config\mihomo"
$SourceDir = "$env:USERPROFILE\Mihomo"
$ScriptSrc = Join-Path $PSScriptRoot "clash.ps1"
$ScriptDst = Join-Path $InstallDir "clash.ps1"
# ─── 架构检测 ───
$arch = if ($env:PROCESSOR_ARCHITECTURE -eq "ARM64") { "arm64" } else { "amd64" }
# ─── 下载地址 ───
$mihomoAsset = if ($arch -eq "arm64") {
"mihomo-windows-arm64-$MihomoVersion.zip"
} else {
"mihomo-windows-amd64-v1-$MihomoVersion.zip"
}
$mihomoUrl = "https://github.com/MetaCubeX/mihomo/releases/download/$MihomoVersion/$mihomoAsset"
$wintunUrl = "https://www.wintun.net/builds/wintun-$WintunVersion.zip"
# ─── 颜色 ───
$e = [char]27
$Bold = "$e[1m"
$Green = "$e[0;32m"; $BoldGreen = "$e[1;32m"
$Red = "$e[0;31m"
$Yellow= "$e[0;33m"
$Cyan = "$e[0;36m"
$Purple= "$e[0;35m"
$NC = "$e[0m"
function W-Step { Write-Host " ${Cyan}${NC} $args" }
function W-Done { Write-Host " ${Green}${NC} $args" }
function W-Fail { Write-Host " ${Red}${NC} $args" }
function W-Note { Write-Host " ${Yellow}${NC} $args" }
# ─── 横幅 ───
Write-Host ""
Write-Host " ${Purple}╭──────────────────────────────────────╮${NC}"
Write-Host " ${Purple}${NC} ${Bold}Mihomo Kernel Manager 部署脚本${NC} ${Purple}${NC}"
Write-Host " ${Purple}╰──────────────────────────────────────╯${NC}"
Write-Host ""
# ─── 前置检查 ───
Write-Host " ${Bold}── 系统检查 ──${NC}"
Write-Host ""
# PowerShell 版本
W-Step "PowerShell 版本 ... "
$psVersion = $PSVersionTable.PSVersion
if ($psVersion.Major -ge 7) {
Write-Host "${Green}已安装 ($psVersion)${NC}"
} else {
Write-Host "${Yellow}版本过低 ($psVersion),需要 7.0+${NC}"
Write-Host " 请运行: winget install Microsoft.PowerShell"
exit 1
}
# 创建目录
Write-Host ""
Write-Host " ${Bold}── 初始化目录 ──${NC}"
Write-Host ""
W-Step "安装目录 ($InstallDir) ... "
New-Item -ItemType Directory -Path $InstallDir -Force | Out-Null
W-Done "已创建"
W-Step "配置目录 ($ConfigDir) ... "
New-Item -ItemType Directory -Path $ConfigDir -Force | Out-Null
W-Done "已创建"
W-Step "源文件目录 ($SourceDir) ... "
New-Item -ItemType Directory -Path $SourceDir -Force | Out-Null
W-Done "已创建"
# ─── 下载 mihomo 内核 ───
Write-Host ""
Write-Host " ${Bold}── 下载 mihomo 内核 ──${NC}"
Write-Host ""
$mihomoExe = Join-Path $InstallDir "mihomo.exe"
$needDownload = $true
if (Test-Path $mihomoExe) {
W-Note "mihomo.exe 已存在"
$ans = Read-Host " 重新下载? (y/n)"
if ($ans -ne 'y') { $needDownload = $false }
}
if ($needDownload) {
W-Step "架构: $arch"
W-Step "版本: $MihomoVersion"
Write-Host " 下载中 ..."
$tempDir = New-Item -ItemType Directory -Path ([System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), "mihomo-install-$(Get-Random)")) -Force
$mihomoZip = Join-Path $tempDir.FullName $mihomoAsset
try {
Invoke-WebRequest -Uri $mihomoUrl -OutFile $mihomoZip -UseBasicParsing
} catch {
W-Fail "下载失败: $_"
W-Note "手动下载: $mihomoUrl"
W-Note "解压 mihomo.exe 到: $InstallDir"
exit 1
}
# 解压
W-Step "解压中 ..."
Expand-Archive -Path $mihomoZip -DestinationPath $tempDir.FullName -Force
# 找到 mihomo 可执行文件并复制(官方 zip 内名为 mihomo-windows-amd64-v1.exe
$extracted = Get-ChildItem $tempDir.FullName -Recurse -Filter "*.exe" |
Where-Object { $_.Name -like "mihomo*" } | Select-Object -First 1
if ($extracted) {
Copy-Item $extracted.FullName $mihomoExe -Force
W-Done "mihomo.exe 已安装"
} else {
W-Fail "未在压缩包中找到 mihomo.exe"
exit 1
}
# 清理临时文件
Remove-Item $tempDir.FullName -Recurse -Force -ErrorAction SilentlyContinue
}
# ─── 下载 wintun.dll ───
Write-Host ""
Write-Host " ${Bold}── 下载 wintun.dll ──${NC}"
Write-Host ""
$wintunDll = Join-Path $InstallDir "wintun.dll"
$needWintun = $true
if (Test-Path $wintunDll) {
W-Note "wintun.dll 已存在"
$ans = Read-Host " 重新下载? (y/n)"
if ($ans -ne 'y') { $needWintun = $false }
}
if ($needWintun) {
W-Step "版本: $WintunVersion"
Write-Host " 下载中 ..."
$tempDir = New-Item -ItemType Directory -Path ([System.IO.Path]::Combine([System.IO.Path]::GetTempPath(), "wintun-install-$(Get-Random)")) -Force
$wintunZip = Join-Path $tempDir.FullName "wintun.zip"
try {
Invoke-WebRequest -Uri $wintunUrl -OutFile $wintunZip -UseBasicParsing
} catch {
W-Fail "下载失败: $_"
W-Note "手动下载: $wintunUrl"
W-Note "提取 wintun\bin\$arch\wintun.dll 到: $InstallDir"
exit 1
}
# 解压
W-Step "解压中 ..."
Expand-Archive -Path $wintunZip -DestinationPath $tempDir.FullName -Force
# 找到对应架构的 wintun.dll
$wintunSrc = Join-Path $tempDir.FullName "wintun\bin\$arch\wintun.dll"
if (Test-Path $wintunSrc) {
Copy-Item $wintunSrc $wintunDll -Force
W-Done "wintun.dll 已安装 ($arch)"
} else {
W-Fail "未找到 $arch 架构的 wintun.dll"
exit 1
}
# 清理临时文件
Remove-Item $tempDir.FullName -Recurse -Force -ErrorAction SilentlyContinue
}
# ─── 部署 clash.ps1 ───
Write-Host ""
Write-Host " ${Bold}── 部署管理脚本 ──${NC}"
Write-Host ""
if (Test-Path $ScriptSrc) {
W-Step "安装 clash.ps1 ... "
Copy-Item $ScriptSrc $ScriptDst -Force
W-Done "已部署 → $ScriptDst"
} else {
W-Fail "未找到 clash.ps1(请确保 install.ps1 和 clash.ps1 在同一目录)"
exit 1
}
# ─── 添加到 PATH ───
Write-Host ""
Write-Host " ${Bold}── 配置 PATH ──${NC}"
Write-Host ""
$userPath = [Environment]::GetEnvironmentVariable("PATH", "User")
if ($userPath -and $userPath.Split(';') -contains $InstallDir) {
W-Done "PATH 中已存在: $InstallDir"
} else {
W-Step "添加到用户 PATH ... "
$newPath = if ($userPath) { "$userPath;$InstallDir" } else { $InstallDir }
[Environment]::SetEnvironmentVariable("PATH", $newPath, "User")
W-Done "已添加: $InstallDir"
W-Note "请重新打开终端使 PATH 生效"
}
# ─── 完成 ───
Write-Host ""
Write-Host " ${Purple}╭──────────────────────────────────────╮${NC}"
Write-Host " ${Purple}${NC} ${BoldGreen}✅ 部署完成!${NC} ${Purple}${NC}"
Write-Host " ${Purple}╰──────────────────────────────────────╯${NC}"
Write-Host ""
Write-Host " 接下来:"
Write-Host " ${Cyan} 1.${NC} 把你的 .yaml 配置文件放入 ${Bold}$SourceDir${NC}"
Write-Host " ${Cyan} 2.${NC} 重新打开终端,运行 ${Bold}clash.ps1 start${NC} 启动"
Write-Host " ${Cyan} 3.${NC} 运行 ${Bold}clash.ps1${NC} 进入交互菜单"
Write-Host ""
Write-Host " 更多命令: ${Bold}clash.ps1 help${NC}"
Write-Host ""