You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell Chocolatey安装脚本多选项并行安装功能实现咨询

PowerShell Chocolatey多软件并行安装脚本修改方案

原有脚本问题

你原有脚本存在冗余的until循环、输入校验仅支持单选项、无并行执行逻辑三个核心问题,修改后可直接实现多选并行安装功能。

实现逻辑

  1. 支持用户用逗号/空格分隔输入多个选项编号,比如输入1,3,5即可同时安装编号1、3、5对应的软件
  2. 对输入的多个编号逐一校验合法性,过滤无效输入
  3. 采用PowerShell后台任务Start-Job实现并行安装,兼容所有PowerShell版本
  4. 所有安装任务执行完成后统一输出执行结果

完整可运行脚本

# 安装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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:06:05