120 lines
3.8 KiB
PowerShell
120 lines
3.8 KiB
PowerShell
# 设置严格模式,遇到错误停止,防止错误的命令雪崩
|
|
$ErrorActionPreference = "Stop"
|
|
#Set-StrictMode -Version Latest
|
|
|
|
# === 1. 加载依赖库 ===
|
|
# 确保 lib 目录存在
|
|
if (-not (Test-Path "$PSScriptRoot\lib")) {
|
|
Write-Error "Cannot find ./lib, some files missing."
|
|
exit 1
|
|
}
|
|
|
|
# === 2. 读取配置 ===
|
|
$jsonPath = "$PSScriptRoot\config\apps.json"
|
|
if (-not (Test-Path $jsonPath)) {
|
|
Write-Error "Cannot find: $jsonPath"
|
|
exit 1
|
|
}
|
|
|
|
Write-Host "Reading configurations..." -ForegroundColor Cyan
|
|
# 使用 UTF8 读取防止中文乱码
|
|
$apps = Get-Content $jsonPath -Encoding UTF8 | ConvertFrom-Json
|
|
|
|
# === 3. 主循环 ===
|
|
foreach ($app in $apps) {
|
|
Write-Host "`n==========================================" -ForegroundColor Cyan
|
|
Write-Host "Installing: $($app.Name)" -ForegroundColor Yellow
|
|
Write-Host "=========================================="
|
|
|
|
# --- 步骤 A: Winget 安装 ---
|
|
$wingetArgs = @(
|
|
"install",
|
|
"--id", $app.Id,
|
|
"-e",
|
|
"--silent",
|
|
"--accept-package-agreements",
|
|
"--accept-source-agreements",
|
|
"--disable-interactivity",
|
|
"--scope", "machine"
|
|
)
|
|
|
|
# [版本检查逻辑]
|
|
# 检查 Version 是否存在且不为空字符串
|
|
if (-not [string]::IsNullOrWhiteSpace($app.Version)) {
|
|
Write-Host "-> Version: $($app.Version)"
|
|
$wingetArgs += "-v"
|
|
$wingetArgs += $app.Version
|
|
} else {
|
|
Write-Host "-> Version: latest"
|
|
}
|
|
|
|
Write-Host "-> Installing via winget..."
|
|
|
|
# 执行安装
|
|
$proc = Start-Process -FilePath "winget" -ArgumentList $wingetArgs -Wait -PassThru -NoNewWindow
|
|
|
|
# 检查安装结果 (0=成功, -1978335189=已安装)
|
|
if ($proc.ExitCode -eq 0) {
|
|
Write-Host "[Success]" -ForegroundColor Green
|
|
} elseif ($proc.ExitCode -eq -1978335189) {
|
|
Write-Host "[Skip] Already installed" -ForegroundColor Yellow
|
|
continue # 已经安装的为了避免覆盖配置,也就不配置了
|
|
} else {
|
|
Write-Error "[Fail] Error code: $($proc.ExitCode)"
|
|
continue # 安装失败则跳过后续配置
|
|
}
|
|
|
|
# --- 步骤 B: PostInstall 配置 ---
|
|
if ($app.PostInstall -and $app.PostInstall.Count -gt 0) {
|
|
Write-Host "`n-> Configuring..." -ForegroundColor Cyan
|
|
|
|
$stepIndex = 0
|
|
foreach ($action in $app.PostInstall) {
|
|
|
|
# [间隔逻辑] 如果这不是第一步,先等待 2 秒
|
|
if ($stepIndex -gt 0) {
|
|
Write-Host "(Waiting 2 seconds...)" -ForegroundColor DarkGray
|
|
Start-Sleep -Seconds 2
|
|
}
|
|
|
|
try {
|
|
switch ($action.Type) {
|
|
|
|
# 1. 复制文件
|
|
"FileCopy" {
|
|
& "$PSScriptRoot\lib\invoke-filecopy.ps1" `
|
|
-Source $action.Source `
|
|
-Destination $action.Destination
|
|
}
|
|
|
|
# 2. 导入注册表
|
|
"RegImport" {
|
|
& "$PSScriptRoot\lib\invoke-regimport.ps1" `
|
|
-Path $action.Path
|
|
}
|
|
|
|
# 3. 执行 CMD
|
|
"Command" {
|
|
& "$PSScriptRoot\lib\invoke-cmdexec.ps1" `
|
|
-Command $action.Command `
|
|
-WorkDir $action.WorkDir
|
|
}
|
|
|
|
Default {
|
|
Write-Warning "`nUnknown action: $($action.Type)"
|
|
}
|
|
}
|
|
} catch {
|
|
Write-Error "`nFailed to operate step $($stepIndex + 1): $_"
|
|
}
|
|
|
|
$stepIndex++
|
|
}
|
|
} else {
|
|
Write-Host "-> No configurations." -ForegroundColor DarkGray
|
|
}
|
|
}
|
|
|
|
Write-Host "`n=== Done ===" -ForegroundColor Green
|
|
Pause
|