Files
Clash/install.ps1
T

229 lines
8.3 KiB
PowerShell

#!/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 可执行文件到: $InstallDir" # BUGFIX: 提示文案从 "mihomo.exe" 改为 "mihomo 可执行文件",因为 zip 内文件名不是 mihomo.exe
exit 1
}
# 解压
W-Step "解压中 ..."
Expand-Archive -Path $mihomoZip -DestinationPath $tempDir.FullName -Force
# 找到 mihomo 可执行文件并复制
# BUGFIX: 官方 zip 内二进制名为 mihomo-windows-amd64-v1.exe,不是 mihomo.exe
# 旧逻辑用 -Filter "mihomo.exe" 精确匹配会找不到,改用 *.exe 通配 + like "mihomo*" 模糊匹配
# 这样对 amd64(v1/compatible)、arm64 等所有架构变体都有效
$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 可执行文件" # BUGFIX: 同上,提示文案从 "mihomo.exe" 改为 "mihomo 可执行文件"
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 ""