# 设置严格模式,遇到错误停止,防止错误的命令雪崩 $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