ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Chocolatey实战指南:Windows命令行包管理器安装与批量部署

Chocolatey实战指南:Windows命令行包管理器安装与批量部署 1. Chocolatey到底是什么Windows软件安装被忽视的效率问题很多Windows用户装软件的习惯基本还是“打开浏览器、搜索官网、下载exe、双击、下一步、下一步、完成”装完以后如果哪天想升级还得把这一套流程再走一遍。遇到要装Java、Node.js、Git、VS Code这些开发工具时这种反复操作会特别让人崩溃。我最早意识到这个问题是在一次折腾新开发机的时候手动装完五个软件加配置环境变量整整耗了一个上午而同样的需求用Linux上的apt或者Homebrew几分钟就能搞定。Chocolatey就是用来解决Windows上这个问题的一个包管理器。它的定位和Linux下的apt-get、macOS下的Homebrew是一样的通过命令行工具一句话就能完成软件的搜索、安装、升级和卸载。你只要输入choco install googlechrome -y系统就会自动从Chocolatey的官方软件仓库下载Chrome的安装包然后静默安装到指定路径整个过程不需要弹窗、不需要点下一步、不需要手动选择安装目录。装完之后想更新一条choco upgrade all就能把机器上所有通过Chocolatey安装的软件统一升级。Chocolatey最初出现在2011年发展到现在官方社区仓库里的软件包数量已经超过一万个覆盖开发工具、浏览器、通讯软件、系统工具、数据库客户端等常见需求。它本质上是一个脚本封装加包分发的框架每个软件包对应一个配置文件里面写明了下载地址、校验值、静默安装参数、依赖关系等信息。Chocolatey下载这些包之后会用静默参数执行安装再把安装路径写入环境变量。这个工具最适合三种人第一种是开发者尤其是刚入职需要快速把开发环境搭起来的新人第二种是运维或IT管理员需要在多台Windows机器上批量部署同样软件的场景第三种是普通电脑用户厌倦了到处找安装包、点下一步的繁琐流程。这篇文章我不会只讲“怎么装”而是把安装前后的所有关键点、常用命令的底层逻辑、批量部署的完整流程以及我自己实际踩过的坑都写清楚保证你读完能直接用起来。2. 安装Chocolatey环境检查、执行策略与一条命令的完整拆解2.1 安装前必须确认的三件事Chocolatey的安装脚本虽然只有一条命令但它在背后做的事情不少。安装前我建议你先确认三个基础条件避免后面执行到一半报错。第一操作系统版本。Chocolatey官方支持Windows 7 SP1、Windows Server 2008 R2以及所有更新的Windows版本Windows 10和Windows 11是完全支持的。如果你还在用更老的系统建议先升级系统再做其他打算。第二PowerShell版本。安装脚本依赖PowerShell 2.0及以上版本Windows 10/11自带的PowerShell 5.1完全满足要求。如果你的系统比较老可以先运行$PSVersionTable.PSVersion检查一下PowerShell版本号。低于2.0的话需要先升级Windows Management Framework。第三管理员权限。这是最容易忽略的一点。Chocolatey需要安装在C:\ProgramData\chocolatey目录下并且要修改系统环境变量普通权限根本写不进去。所以无论用哪种安装方式都必须以管理员身份打开PowerShell或CMD。我见过不少人在普通终端里执行安装命令结果提示“Access to the path is denied”其实就是权限不够。关于执行策略这里值得单独说一下。Windows默认的PowerShell执行策略是Restricted限制本机执行任何脚本。Chocolatey安装时用到的install.ps1就是一个脚本文件不调整策略会被直接拦截。官方推荐的做法是在当前会话内临时设置为Bypass而不是全局修改这样既不影响系统原有安全配置又能让安装脚本跑起来。提示如果你对PowerShell执行策略不熟悉“Bypass -Scope Process”的意思是在当前这个命令行窗口的生命周期内跳过所有脚本执行限制关掉窗口就恢复原样不会污染全局配置。这也是官方推荐这种写法的原因。2.2 官方推荐的安装命令与备选方案官方标准的安装命令是在管理员身份的PowerShell中逐行执行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))这几行命令的意思分别是临时放开脚本执行限制启用TLS 1.2加密协议这个在老的Windows系统上是必须的否则下载脚本时会因为协议不匹配失败从官方地址下载安装脚本并在当前会话里执行。执行完后系统会在C:\ProgramData\chocolatey下创建程序目录同时添加环境变量ChocolateyInstall并把C:\ProgramData\chocolatey\bin加入系统PATH。以后你在任意终端里输入choco命令系统都能找到它。安装完成后我习惯用下面三行做一次自检choco --version choco -? $env:ChocolateyInstall第一行显示Chocolatey版本号第二行显示帮助信息第三行显示安装目录。这三条都正常说明安装环节没有大问题。如果你的机器网络不太好无法直接拉取install.ps1脚本也有备选方案。先在能联网的电脑上把https://community.chocolatey.org/install.ps1这个文件保存成install.ps1拷贝到目标机器然后在管理员PowerShell里执行Set-ExecutionPolicy Bypass -Scope Process -Force .\install.ps1这个方式和在线执行是等价的因为脚本体本身只在下载完成后涉及少量网络请求。还有一个稍微麻烦但更可控的办法是先下载Chocolatey的nupkg包手动解压后运行包内的工具完成安装。这个方法适合完全离线的内网环境我会在后面企业部署的部分详细说明。2.3 安装时的常见问题预判装的时候最容易遇到两类问题。一类是前面提到的TLS协议报错错误信息通常类似“The request was aborted: Could not create SSL/TLS secure channel”说明当前PowerShell默认用的还是旧版TLS。解决方法就是在安装命令前执行那一行[System.Net.ServicePointManager]::SecurityProtocol ... -bor 3072把TLS 1.2加上。另一类是杀毒软件拦截。Chocolatey安装脚本本质上是PowerShell脚本某些杀毒软件对这类行为比较敏感会在脚本尝试写入ProgramData目录时弹出拦截提示或直接隔离。如果你遇到了安装时被莫名终止的情况先看杀毒软件的隔离记录然后把C:\ProgramData\chocolatey目录加进信任白名单再重试。这个过程不是Chocolatey有什么问题而是安全软件的“宁可错杀”策略导致的。我之前在给公司一台Windows Server 2016装Chocolatey时还遇到过一种情况安装脚本执行后脚本中途报了一个依赖项下载失败的错误回滚了。后来排查发现是这台服务器的IE增强安全配置开着阻止了脚本里的某些下载请求。如果你是给Windows Server装机装之前记得在“服务器管理器-本地服务器”里把“IE增强的安全配置”临时关掉装完再打开。这个问题在个人版Windows上不存在但在服务器场景里非常容易出现。3. 核心命令实战搜索、安装、升级、卸载一篇讲透3.1 搜索和查看软件包信息装好Chocolatey之后第一步肯定是找软件。命令格式很简单choco search 关键词比如你想找Chrome就执行choco search chrome。返回的列表里会显示所有名称里包含“chrome”的软件包第一列是包名第二列是版本号。这个命令走的是Chocolatey官方的公共源如果你后续配置了私有源它也会一并搜索。搜索界面需要注意的是“正好找到你要的包”和“找到了一堆相似但不对的包”是两回事。搜索chrome会返回几十条记录其中googlechrome才是Google Chrome的官方封装包其他可能是chrome衍生版、浏览器扩展或者不相关的项目。想确认某个包具体信息用choco infochoco info googlechrome这个命令会显示软件包的详细说明、软件官网地址、当前版本、作者、下载次数、依赖项等信息。我建议你在正式安装一个不熟悉的包之前随手敲一下choco info重点看两个字段一个是“Software Site”是不是软件的官方站点防止装到来源不明的包另一个是“Package Checksum”是否有效Chocolatey会默认校验安装包的正确性但有些老包可能没配校验值。还有一个比较实用的命令是choco list。不带任何参数时它显示的是本机已经安装的所有Chocolatey包注意它显示的是“通过Chocolatey安装的软件”不是Windows系统里所有已安装软件。Chocolatey的原理决定了它只管理自己装的软件早期手动安装的软件它不会出现在列表里。3.2 安装软件的完整命令与参数解析安装是Chocolatey的核心用法基础命令是choco install 包名执行过程中Chocolatey会先解析该软件的依赖项把依赖一起装上然后下载安装包到临时目录校验哈希值再用静默参数执行安装。整个过程在屏幕上会输出很多信息包括下载进度、校验结果、安装日志。首次安装时Chocolatey还会提示你确认“是否运行安装脚本”输入y回车即可或者直接用-y参数跳过确认。实际使用中我高频使用的参数有这么几个choco install 包名 -y # 自动确认无需手动输入 choco install 包名 --version 版本号 # 安装指定版本 choco install 包名 --force # 强制重装已存在的软件 choco install 包名 -s 源地址 # 指定从哪个源安装 choco install 包名 --params 参数 # 向安装程序传递自定义参数-y是最常用的尤其是脚本化安装时没有人守在终端前输入确认。--version用于需要固定版本的场景比如你想装特定版本的Node.js直接choco install nodejs --version20.11.0即可。--params这个参数值得多说一句它可以把参数透传给底层的安装程序。比如安装某些软件时想指定安装目录可以先在choco帮助文档里查这个包支持哪些参数然后通过--params传/D指定路径。每个包的参数不太一样需要灵活查证。安装多个软件时可以一次性写在命令后面choco install git vscode nodejs-lts 7zip -yChocolatey会按顺序逐个处理。如果你在装开发环境我个人的建议是把常用工具列成一个固定的启动清单每次新机初始化直接复制这一串命令即可省时省力。你的清单不需要多长但一定要选好稳定的核心工具比如浏览器、编辑器、终端工具、Git、语言运行时这些一旦装好后续开发基本不会动。3.3 升级、卸载和版本锁定的正确姿势软件装好之后升级是另一个高频操作。升级单个软件choco upgrade 包名升级全部软件choco upgrade all -yall在这里是一个特殊标识表示对本机所有已安装的Chocolatey包执行升级检查。执行前Chocolatey会先获取每个包的最新版本如果有更新就下载并安装。我提醒一下生产环境的机器不要随手choco upgrade all。因为有些软件的新版本可能引入破坏性变更比如Node.js大版本升级后旧项目的依赖可能直接跑不起来。稳妥的做法是先跑choco outdated查看有哪些包可以升级再逐个用choco upgrade 包名处理。有些软件不能随便升级或者某个版本是项目锁定使用的这时候要用版本锁定功能choco pin add -n包名 choco pin add -n包名 --version版本号choco pin会把指定包标记为“不参与升级”执行choco upgrade all时会自动跳过它。这个功能在管理企业环境时特别有用。比如几十台服务器上部署的Java 8如果某天有人用upgrade all把Java升到了17所有依赖Java 8的服务都可能崩溃提前做版本锁定就能避免这种风险。卸载相对简单choco uninstall 包名 -yChocolatey会调用该软件自带的卸载程序并尝试清理相关快捷方式和注册表项。但这里有个现实问题不是所有软件都能被彻底干净地卸载。因为Chocolatey本质上是“调用静默卸载参数”如果软件本身的卸载程序写得不干净Chocolatey也没法强行清理。如果卸载后系统里还残留配置目录我建议手动删除用户目录下的AppData对应文件夹以及注册表里对应的卸载项这是所有Windows软件卸载的通病不怪Chocolatey。3.4 常用命令速查表整理一份我日常最常用的命令清单方便你直接抄作业需求命令搜索软件包choco search 关键词查看包详细信息choco info 包名安装软件choco install 包名 -y安装多个软件choco install 包1 包2 包3 -y指定版本安装choco install 包名 --version版本号升级单个软件choco upgrade 包名升级所有软件choco upgrade all -y查看可升级列表choco outdated卸载软件choco uninstall 包名 -y查看本机已装包choco list锁定某个包版本choco pin add -n包名解除锁定choco pin remove -n包名这张表基本覆盖了90%的个人日常使用场景。照着用不需要背参数每次想不起来就打开这篇看一眼。4. 进阶玩法批量部署、离线安装与配置文件标定4.1 用packages.config实现一键批量安装单条命令安装多个软件已经很方便了但如果你想在团队里统一维护一套软件清单比如所有前端开发人员的新机器都必须装Git、VS Code、Node.js、Chrome、7-Zip、Postman这些工具更专业的做法是写一个packages.config文件。这个文件本质上是一个XML格式的清单Chocolatey官方支持你直接基于它执行安装。文件内容可以写成这样?xml version1.0 encodingutf-8? packages package idgit / package idvscode / package idnodejs-lts / package idgooglechrome / package id7zip / package idpostman / /packages把文件保存为packages.config然后在同一目录下执行choco install packages.config -yChocolatey会逐条读取文件里的包并执行安装。这个方式在团队里有几个现实优势第一软件清单纳入版本管理Git仓库里记录每一次软件清单的变更新同事入职拉下来直接跑第二避免“这个包叫什么名字”这种记不住的问题统一由一个人维护第三可以给每个包单独指定版本号实现团队工具版本的一致性。你还可以给配置文件里的包指定额外的安装参数在package标签里增加installArguments属性即可package id某软件 installArguments/DIRD:\Software\某软件 /这样每台机器装出来的软件位置都一样对做统一配置的团队来说非常省心。4.2 离线环境部署手动搭建本地源有些内网开发环境是完全离线的不能访问外网这时候在线安装包源就用不了了。解决思路是把Chocolatey的官方包仓库整个同步到内网的一台服务器上内网机器把源指向这台服务器。先在一台能访问外网的机器上把需要的nupkg包下载下来。Chocolatey的每个软件包实际上是一个.nupkg文件可以用以下命令把指定包下载到本地目录choco download 包名 --sourcehttps://community.chocolatey.org/api/v2/ --output-directoryD:\offline_packages然后把这整个目录拷贝到内网服务器配置一个本地文件源或HTTP源。如果只是单机使用可以直接把目录作为源路径choco install 包名 -s D:\offline_packages这样Chocolatey就会从本地目录寻找包文件不再请求外网。这里有一个细节choco download只下载包本身不会主动下载依赖包所以离线部署前你必须先确认依赖关系把依赖包也一起下载下来。检查依赖用choco info 包名观察返回结果里的Dependencies字段。我刚才提到了Chocolatey包源本质上是一个NuGet源严格来说包源不只是放文件的目录它还需要一个标准的OData服务端点才能被正常识别。对于纯离线的小规模场景最简单的做法是直接复制文件目录配合-s参数使用如果你真的需要在内网搭一个完整可用的HTTP包源可以考虑用NuGet.Server或者BaGet在Windows服务器上搭一个私有源再把Chocolatey的源地址指向它。4.3 用Chocolatey脚本化初始化开发环境把前面提到的技术组合起来就可以实现“一条命令初始化开发环境”的效果。我自己平时会维护一个init-dev.ps1脚本内容大致是Set-ExecutionPolicy Bypass -Scope Process -Force # 安装基础工具 choco install git vscode nodejs-lts googlechrome 7zip -y # 安装Windows Terminal choco install microsoft-windows-terminal -y # 配置Git git config --global user.name 你的名字 git config --global user.email 你的邮箱 # 切换镜像源以npm为例 npm config set registry https://registry.npmmirror.com # 安装常用全局工具 npm install -g yarn pnpm每次拿到新电脑以管理员身份跑一遍这个脚本十几分钟后开发环境就绪。这里每一个环节都依赖Chocolatey帮你把基础软件装到系统里其余的配置命令再按需执行。你完全可以根据自己的岗位和习惯定制一套私有脚本这个过程本身就是效率提升的开始。注意脚本里任何命令都要在坚持安全前提下审查只从你信任的官方或团队内部源获取工具和配置不要随意使用来路不明的包源或脚本避免引入安全风险。5. 常见问题排查安装失败、升级卡死与卸载残留5.1 安装过程中常见的失败原因Chocolatey本身很稳定但它依赖的网络环境、系统权限和软件安装包的静默安装能力会带来不少问题。如果你在执行choco install时报错先看错误信息里有没有“The remote server returned an error: (404) Not Found”或者“Download failed”。这类错误说明Chocolatey从包仓库拿到了信息但实际下载安装包的地址失效了。这种问题通常发生在很老的软件包上维护者没有及时更新下载链接。解决方法是换用其他同类的包或者联系包维护者确认。你也可以先试choco search看有没有该软件的官方更新版本。如果报错是“Exception calling ‘DownloadFile’ with ‘2’ argument(s)”说明下载网络文件时被中断或者被本地安全策略拦截了。可以依次检查网络是否连通了包源地址杀毒软件/防火墙有没有拦截PowerShell或choco的下载行为如果您处在内网环境还需要确认网络策略是否允许访问外部资源。有一个调试小技巧给命令加上--debug参数例如choco install 包名 --debug它会输出详细的执行日志包括访问的URL、HTTP状态码、文件保存路径等信息定位问题会快很多。排查完之后再加--debug运行一次对比输出差异也很有效。5.2 升级卡住、版本不对与代理配置choco upgrade all执行到一半卡住或者明明点了升级但版本没变这个问题在Windows上时有发生。最直接的原因是目标软件正在运行安装程序无法覆盖正在使用的文件。比如你在开着Chrome的状态下升级Chrome安装包会等Chrome退出才能完成替换而choco upgrade此时会显示成功但实际没有生效。解决办法是升级前先关闭对应软件或者接受重启后生效的结果。另一个很容易搞混的情况是choco upgrade 包名显示成功但软件的“关于页面”里版本号还是旧的。这大概率是因为该软件的版本号本身没有变化。Chocolatey的版本号对应的是它仓库里nupkg包的版本而有些软件的安装包本身有多个构建版本Chocolatey认为“包”没有更新但软件实际确实变了。遇到这种“版本对不上”的情况直接看choco outdated的输出它能区分哪些包需要升级。还有人在搜索时发现某些软件包在仓库里显示的和官方发布的不同步多半是包维护者还没更新仓库条目。这种情况没有特别好的解决办法只能等待维护者更新或者自己提交PR去维护这个包。关于国内网络环境访问Chocolatey官方源偶尔慢的问题不建议去随便改源地址尤其不要轻信网上来路不明的“镜像源”容易被投毒。最安全的办法是保持官方源不变如果下载速度慢或超时可以使用团队内部自行搭建的官方包缓存或者错峰操作。这也是为什么我一直强调企业场景要自己维护离线源的原因。5.3 卸载不干净和残留文件处理Chocolatey卸载软件时调用的是软件自带卸载程序这个程序的质量决定了卸载的干净程度。有些软件卸载后会在C:\Program Files下留下空的目录在注册表的HKCU\Software下留下用户配置这些都是正常现象。如果你的目的是彻底清掉一个软件操作路径是先用choco uninstall 包名完成主卸载再手动检查三个位置软件安装目录、用户目录下的AppData\Local和AppData\Roaming对应文件夹、注册表里的Software键。这三个位置基本覆盖了残留的绝大多数情况。再提醒一个场景你安装某个软件时它会自动安装一个附带的更新服务或后台程序这些不一定在Chocolatey的包管理范围内。卸载Chocolatey包不会自动处理这些外部附加项需要去“服务”或“计划任务”里手动禁用或删除。所以说Chocolatey并不是万能的它的核心价值是帮你“批量执行安装动作”而不是帮你“监管一切”。5.4 常见问题速查表我把平时用户问得最多的一些问题整理了成一张表现象可能原因解决思路安装脚本提示TLS错误系统未启用TLS 1.2在脚本前先执行[System.Net.ServicePointManager]::SecurityProtocol ... -bor 3072安装时提示权限不足未以管理员运行终端右键选择“以管理员身份运行”PowerShell或CMD软件安装后命令找不到安装目录没加入PATH手动把软件路径加入系统环境变量或重开终端再试升级后版本没变化软件正在运行或包未更新关闭软件后重试或查看choco outdated下载速度慢网络到官方源延迟高使用团队内部源缓存或错峰下载执行脚本被安全软件拦截杀毒软件策略过严把C:\ProgramData\chocolatey加入白名单后重试安装包校验值不匹配包源维护者未更新或下载不完整查看包信息确认校验值必要时联系包维护者这张表是我在实际使用中沉淀出来的高频问题集覆盖了绝大多数“新手状态”下会遇到的障碍。遇到没覆盖的问题一个通用思路是加--debug参数重跑一次把日志翻出来看大多数答案都在日志里。6. 写在最后我的实操体会与一个小建议Chocolatey用了这么多年我最大的感受是它比任何Windows软件管家都更“透明”。你敲的每条命令都清清楚楚告诉你做了什么失败时会给出日志比那些弹窗广告满天飞的第三方软件中心强太多。它的学习成本也很低不需要你懂PowerShell编程会记几个命令就能用起来。对于开发者来说把软件安装纳入可版本化的脚本流程意义远远大于省下的那几分钟。最后分享一个我最近在用的工作流准备一个U盘里面放上install.ps1和一份自己维护的packages.config再附上离线installer脚本。遇到需要快速配置的机器插上U盘管理员终端里执行一条命令软件清单自动开始安装。这个过程我已经在好几台新电脑和临时测试机上验证过稳定可靠。你可以先从这篇文章里的简单命令开始把搜索、安装、升级三个命令跑熟了再逐步往自己的脚本里加内容。每次积累一点点软件管理这件事就不再是烦心事了。
返回列表