PowerShell Chocolatey安装脚本多选项并行安装功能实现咨询
PowerShell Chocolatey多软件并行安装脚本修改方案
原有脚本问题
你原有脚本存在冗余的until循环、输入校验仅支持单选项、无并行执行逻辑三个核心问题,修改后可直接实现多选并行安装功能。
实现逻辑
- 支持用户用逗号/空格分隔输入多个选项编号,比如输入
1,3,5即可同时安装编号1、3、5对应的软件 - 对输入的多个编号逐一校验合法性,过滤无效输入
- 采用PowerShell后台任务
Start-Job实现并行安装,兼容所有PowerShell版本 - 所有安装任务执行完成后统一输出执行结果
完整可运行脚本
# 安装Chocolatey包管理器 function Install-Choco { Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) } # 优先检查是否已安装Chocolatey,未安装则自动安装 if (-not (Get-Command choco -ErrorAction SilentlyContinue)) { Write-Host "检测到未安装Chocolatey,正在安装..." Install-Choco } # 定义软件包列表 $Packages = 'googlechrome', 'firefox', 'codeblocks', 'windbg', 'nasm', 'explorersuite', 'pestudio', 'vscode', 'sysinternals', 'python', 'ccleaner', 'anaconda3', 'wireshark', 'sublimetext3', 'notepadplusplus' # 展示菜单函数 function Show-Menu { Clear-Host Write-Host "**********************************************" Write-Host "可选软件列表" for ($i = 0; $i -lt $Packages.Count; $i++) { Write-Host ('{0,10}. {1}' -f ($i + 1), $Packages[$i]) } Write-Host " q. 退出脚本" Write-Host "*************************************************" Write-Host "提示:多选用逗号或空格分隔编号,例如输入1,3,5可同时安装对应软件" Write-Host } while ($true) { Show-Menu $UserInput = Read-Host "请选择要安装的软件编号" # 处理退出逻辑 if ($UserInput.Trim() -eq 'q') { break } # 拆分多选项:支持逗号、空格分隔 $inputNumbers = $UserInput -split ',| ' | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne '' } $validPackages = @() $invalidInputs = @() # 校验输入合法性 foreach ($num in $inputNumbers) { if ([int]::TryParse($num, [ref]$null) -and $num -ge 1 -and $num -le $Packages.Count) { $validPackages += $Packages[[int]$num - 1] } else { $invalidInputs += $num } } if ($invalidInputs.Count -gt 0) { Write-Host "无效输入:$($invalidInputs -join ','),可选编号范围为1-$($Packages.Count),或输入q退出" -ForegroundColor Red $null = Read-Host "按回车键继续" continue } if ($validPackages.Count -eq 0) { Write-Host "未选择任何有效软件" -ForegroundColor Yellow $null = Read-Host "按回车键继续" continue } # 并行安装选中的软件 Write-Host "正在并行安装以下软件:$($validPackages -join ',')" -ForegroundColor Green $jobs = $validPackages | ForEach-Object { Start-Job -ScriptBlock { param($pkg) choco install $pkg -y --ignore-checksums return [PSCustomObject]@{ Package = $pkg Success = $LASTEXITCODE -eq 0 } } -ArgumentList $_ } # 等待所有安装任务完成 Write-Host "等待安装完成,请勿关闭窗口..." $jobs | Wait-Job | Out-Null # 输出安装结果 Write-Host "`n安装结果汇总:" foreach ($job in $jobs) { $result = Receive-Job $job if ($result.Success) { Write-Host "✅ $($result.Package) 安装成功" -ForegroundColor Green } else { Write-Host "❌ $($result.Package) 安装失败" -ForegroundColor Red } Remove-Job $job } $null = Read-Host "`n按回车键继续" }
功能说明
- 首次运行会自动检测并安装Chocolatey包管理器,无需手动提前安装
- 支持多选,输入时用逗号或者空格分隔编号即可
- 所有选中软件并行下载安装,比串行安装节省大量时间
- 安装完成后会统一输出每个软件的安装结果
内容的提问来源于stack exchange,提问作者Shravan Meghavath
相关产品推荐
相关产品推荐

