
1. 为什么Windows用户需要一个包管理器从手动装软件说起如果你在Windows上装过开发环境大概经历过这样的场景打开浏览器搜索软件名找到一个看起来像官网的链接点进去半天找不到下载按钮好不容易下载完一个exe双击安装一路Next中途还要小心别点中捆绑安装的“全家桶”。装完一个再来下一个重复劳动。我第一次接触Chocolatey的时候刚转做Windows平台开发维护三台测试机——一台Windows 10两台Windows Server。每次重新配环境都要折腾一个下午Git、Node、Python、VSCode、Chrome、7-Zip、Notepad一个接一个手动装。后来无意中看到同事的PowerShell窗口里敲了一行choco install git -yGit就自己装好了我当时的感觉是Windows上终于有像样的包管理器了。Chocolatey到底是什么一句话概括它是Windows平台的软件包管理器基于NuGet基础设施通过PowerShell命令行自动完成软件的下载、安装、配置和卸载。它能解决的核心问题就是把“搜索-下载-安装-配置”这条手工链路压缩成一条命令同时支持版本锁定、静默安装、批量部署和脚本化运维。这篇文章适合谁读如果你是Windows开发环境的日常使用者被重复安装软件折腾过如果你是运维或SRE需要在多台Windows机器上快速统一装软件哪怕你只是普通用户装了Chocolatey之后想清理系统里的旧软件、批量升级程序这篇都有可操作的干货。2. 安装前的准备执行策略、权限和环境检查2.1 安装Chocolatey的三个前置条件Chocolatey的安装过程不复杂但很多人会卡在第一步——PowerShell执行策略。它可不是一台空机器就能直接跑起来的需要满足以下条件Windows 7 SP1 / Windows Server 2008太老的系统就别折腾了会遇到TLS兼容问题PowerShell 2.0现在基本都是5.1起Windows 10 1809以上默认自带PowerShell 5.1必须使用管理员权限运行的PowerShell或CMD关键是第三点这一步在官方文档里加粗标了但实操中还是很多人忽略。我自己第一次装的时候就没注意在普通用户的PowerShell窗口里运行安装脚本结果报了个Access to the path ... is denied还以为是网络问题排查了半天。2.2 解决执行策略限制绕过还是远程签名执行策略是PowerShell的一道安全门。默认情况下Windows桌面的执行策略是Restricted这意味着你连脚本都跑不了。检查当前策略用这个命令Get-ExecutionPolicy如果返回Restricted有两个选择。一个是临时放开只对当前会话生效Set-ExecutionPolicy Bypass -Scope Process -Force另一个是持久放开到CurrentUser级别这样以后运行其他脚本也方便Set-ExecutionPolicy RemoteSigned -Scope CurrentUser我建议用第二种设置为RemoteSigned——本地脚本直接运行远程下载的脚本必须有可信签名。这个策略比Bypass安全得多也比Restricted实用得多。Chocolatey官方推荐的就是Bypass但它只管装的那一下装完之后日常使用choco命令不需要脚本执行权限所以这里设置成RemoteSigned足够了。2.3 官方安装命令与国内镜像加速官方安装命令是长这样的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第三行是从官方源下载安装脚本并执行。如果你网络顺畅跑完这三行输入choco -v看到版本号就装好了。但如果你在国内或者网络环境一般大概率会卡在下载那一步。我在几台机器上装过的经验是直接访问官方CDN下载install.ps1经常超时。解决办法是把安装脚本下载到本地改一下内部的下载源再本地执行。# 先下载官方安装脚本到本地 Invoke-WebRequest -Uri https://community.chocolatey.org/install.ps1 -OutFile install.ps1 -UseBasicParsing拿到install.ps1之后打开文件找到下载Chocolatey安装包的那一行把https://community.chocolatey.org/api/v2/package/chocolatey/替换成国内的NuGet镜像地址比如华为云镜像、阿里云镜像的NuGet源保存后本地执行Set-ExecutionPolicy Bypass -Scope Process -Force .\install.ps1我自己用过之后的感觉是镜像加速的效果非常显著原来可能几十KB/s的下载速度能提到几MB/s。不过有一点要注意镜像站的包同步有延迟新发布的软件版本在镜像上可能等几天才有如果你在下载某个包的时候遇到404切回官方源试试往往能找到原因。2.4 验证安装和环境变量装完之后验证方式很简单choco -v choco --version # 或者看帮助信息 choco --helpChocolatey默认把主程序装在C:\ProgramData\chocolatey注意是ProgramData不是Program Files这个目录是隐藏的在资源管理器里要开启“显示隐藏项目”才能看到。它的shim命令转发器目录在C:\ProgramData\chocolatey\bin安装软件时自动把这个目录加进PATH。这里有一个常见的坑装完Chocolatey之后你当前已经打开的PowerShell或CMD窗口里PATH没有刷新直接敲choco会提示“不是内部或外部命令”。重开一个终端窗口再试就好了。如果重开之后还是找不到手动检查一下这个路径在不在系统PATH里$env:Path -split ; | Where-Object { $_ -match chocolatey }3. 核心命令体系从安装、卸载到批量升级3.1 搜索和查看软件包信息Chocolatey的灵魂在于它背后那个庞大的软件仓库。官方源的软件包数量超过10000个日常开发用到的绝大多数软件都能搜到。查询一个软件在仓库里是否存在choco search git # 或者模糊搜索 choco search notepad这个命令会返回一堆相关包注意区分主包和依赖包。比如搜索git可能出来git、git-lfs、git-fork、gitextensions等多个结果主包一般是重名或名字最贴近的那个其余的要么是增强工具要么是别的软件的依赖。想知道一个包的详细信息包括版本号、依赖关系、下载地址choco info git一个容易忽略的细节是choco search和choco list的关系。在早期版本里两者功能有区别现在已经合并了choco list等同于choco search都是按关键字搜索远程仓库的包。如果你用的是旧教程里的命令出现“找不到命令”的情况多半是命令已合并进了choco search。查看本机已经安装了哪些Chocolatey包choco list --local-only # 或简写 choco list -lo这个命令在你几个月没清理系统、忘了装过什么的时候特别有用也是审计软件资产的第一步。3.2 安装软件最常见参数与静默安装原理安装一个软件最简形式是choco install git -y-y参数表示自动确认跳过安装前的提示交互。Chocolatey的软件包内嵌了安装指令自动对应每个软件的静默安装方式。比如Git的静默安装参数是/VERYSILENT /NORESTARTNotepad的静默安装参数是/SChrome则走的是系统级的机器级安装策略。换句话说你不需要知道每个软件自己特有的静默参数Chocolatey已经把这事封装好了。同时装多个软件choco install git vscode nodejs python -y一条命令批量装装完自动配好PATH。这里有个小技巧如果你在装多个包时其中一个下载失败Chocolatey默认会中断还是继续实际上它会继续尝试其他包最后汇总报告哪些成功哪些失败。失败的那个单独重装就行不用全部重来。装特定版本choco install nodejs --version14.17.0 -y版本锁定在运维场景下很重要尤其是开发环境需要固定Node版本、Python版本的时候。如果不指定版本Chocolatey会装最新版这在有些时候反而是个坑——新版本可能有兼容性问题所以生产环境建议总是显式指定版本号。3.3 升级、卸载和降级软件升级一条命令choco upgrade all -y这条是把本机所有Chocolatey管理的软件全部更新到最新版一次性搞定。跟手动安装软件后逐个去检查更新相比效率提升可以说是指数级的。不过升级有风险最典型的是开发工具升级导致环境不兼容。比如Node主版本升级后全局安装的npm包可能需要重新编译PHP升到新版本后扩展可能加载不了。所以我对choco upgrade all的态度是有条件使用测试机和开发机可以生产服务器上要谨慎最好升级前把包列表导出一份做备份。导出当前包清单的命令choco list -lo -r | Out-File -FilePath choco-packages.txt卸载软件同样简单choco uninstall git -y这里要提醒一句Chocolatey卸载时执行的是软件自带的卸载程序有些软件卸载后会在系统里留一些配置文件或注册表项这跟手动卸载的行为是一样的Chocolatey不会做额外清理。如果你需要彻底清理还得配合软件自身的清除模式比如很多软件的/clean参数或第三方卸载工具。降级操作很有意思Chocolatey官方没有提供专门的downgrade命令但你可以手动指定版本再装一遍choco install git --version2.30.0 -y --force--force参数的作用是覆盖安装——即使已经装了其他版本也会强制安装指定版本。3.4 查看已装软件的可升级版本不升级只想看看有哪些新版可用choco outdated这个命令非常实用输出格式类似这样Git | 2.39.1 | 2.40.0 Node.js | 18.15.0 | 20.0.0左边是当前版本右边是仓库里的最新版本。我每周会在开发机上跑一次这个命令扫一眼有哪些更新再决定要不要动。它比你去每个软件官网看更新日志高效得多。4. 实战中的高频坑踩过一遍才有资格说4.1 坑一安装源连接超时镜像源配置全流程国内用户最痛的问题就是速度。用官方源装一个几百MB的软件进度条走半天纹丝不动最后告诉你超时。根本原因就是官方CDN的连通性不稳定。解决办法有两个层面。第一个层面是给Chocolatey配镜像源第二个层面是给软件本身走代理。先看怎么配源。Chocolatey的仓库地址通过choco source命令管理# 查看当前源 choco source list # 添加国内镜像源 choco source add -n huawei -s https://mirrors.huaweicloud.com/repository/chocolatey/ --priority1 # 禁用官方源保留但不优先 choco source disable -n chocolatey注意--priority参数数值越小优先级越高。我习惯保留官方源作为备用优先级设低一些这样镜像源上没有的新包还能自动降级去官方源下载。如果镜像源上有某个包但版本旧你也可以临时指定官方源安装避免版本落后choco install somepackage -y --sourcehttps://community.chocolatey.org/api/v2/配好镜像源之后建议跑一次choco upgrade chocolatey把Chocolatey自身更新到最新版很多历史版本的下载逻辑优化都在新版里。第二个层面是如果公司网络需要走代理才能访问外网Chocolatey也支持代理配置choco config set proxy http://proxy.example.com:8080 choco config set proxyUser username choco config set proxyPassword password或者临时指定代理choco install git -y --proxyhttp://proxy.example.com:80804.2 坑二安装免安装版软件的目录约定很多人用Chocolatey装完软件之后找不到软件装到哪儿去了。比如choco install vscode之后VSCode装到了C:\Program Files\Microsoft VS Code而Chocolatey的shim在C:\ProgramData\chocolatey\bin里生成了一个code.exe的转发器。但有些软件是绿色免安装包比如choco install sysinternalsChocolatey会把它们解压到C:\ProgramData\chocolatey\lib\sysinternals\tools而不是Program Files。所以当你找不着软件时第一反应应该是去choco list -lo确认包名然后打开C:\ProgramData\chocolatey\lib\包名\看具体的安装脚本和文件列表。这个lib目录下的每个包都包含一个.nupkg文件NuGet包和一个tools目录tools目录里放着Chocolatey的安装脚本chocolateyinstall.ps1它定义了安装行为。想深入了解一个包具体做了什么打开这个脚本看是最直接的。这也是排查安装失败的核心手段。4.3 坑三非管理员终端运行命令的各种报错Chocolatey的命令日常运行也要求管理员权限。如果你在普通窗口运行choco install会看到类似ERROR: Exception calling CreateDirectory with 1 argument(s): Access to the path C:\ProgramData\chocolatey is denied.的报错。这个错误信息很直白就是权限不够。有些菜鸟教程会告诉你“右键以管理员身份运行PowerShell”然后就不管了。但实操中你会遇到另一个问题你已经以管理员身份打开了PowerShell但仍然报错。这种情况的原因通常是——你用的是内置管理员账户触发了UAC的“管理员批准模式”或者你的账户虽然在管理员组但Chocolatey安装目录的所有权没有包含你的账户。解决办法也简单先确认执行策略没被改回去再检查目录权限# 确认执行策略 Get-ExecutionPolicy # 确认是否管理员身份运行 ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)第二步返回False就说明你确实不是管理员。返回True还报权限错误那就需要检查C:\ProgramData\chocolatey的目录ACL把完全控制权给你的账户。4.4 坑四公司电脑上安装软件被组织策略拦截在企业环境里你的Windows可能受组策略约束很多软件安装需要本地管理员权限。这时候Chocolatey会报一些奇怪的错误比如安装到一半提示“系统管理员已阻止此应用”或者类似“Policy does not allow”的信息。这个坑没法用技术手段绕过去正确姿势是向IT部门申请权限。不过你可以先告诉ITChocolatey安装的软件走的是静默安装方式可以配置一个全局的软件白名单用choco install时只允许列表内的包。这样既满足合规要求又能享受批量安装的效率。我在给公司做Windows节点标准化的时候就是这么跟运维同事配合的先跑一遍choco list -lo导出清单IT审核后允许清单内的包名继续安装禁止其他未知包。4.5 坑五装了软件但命令找不到的命令路径问题装完软件敲命令提示“不是内部或外部命令”这个在Windows上非常常见。原因主要有两种一是PATH环境变量没刷新二是Chocolatey的shim没有正常生成。第一种好办重开终端窗口就行。第二种要去C:\ProgramData\chocolatey\bin目录看一眼正常情况下每个软件都会生成一个与主程序同名的shim文件。如果没有可能是安装过程中shim生成失败可以用choco install 包名 -y --force重新装一遍或者在程序目录里手动把这个目录加进PATH。4.6 坑六某个软件安装总是失败如何手动查看安装日志Chocolatey的日志默认写在$env:TEMP目录下文件格式类似chocolatey-20250225-153000.log。手动查看Get-ChildItem $env:TEMP -Filter chocolatey*.log | Sort-Object LastWriteTime -Descending | Select-Object -First 5打开最新的那个log重点看Running chocolateyinstall.ps1到Finishing之间的输出卸载失败的软件通常在这里会给出具体的错误代码。比如最常见的0x80070643是安装程序自身返回的错误0x80070659则是WiX安装引导失败。有一次我装Python一直失败查日志发现是杀毒软件拦截了安装进程对系统目录的写入。还有一次装Git失败日志显示是安装包下载不完整哈希校验不过——重新下载就好了。所以别急着重装系统先看日志日志会告诉你80%的原因。5. 进阶玩法从单机使用到批量部署5.1 用配置文件批量安装一整套环境有没有想过重装系统之后一条命令恢复全部软件Chocolatey的配置文件机制就是干这个的。它支持JSON格式的包列表示例{ name: dev-environment, packages: [ { id: git, version: 2.40.0 }, { id: vscode }, { id: nodejs, version: 18.16.0 }, { id: python }, { id: 7zip } ] }保存为packages.config然后执行choco install packages.config -y它会按顺序逐个安装并在最后汇总输出成功和失败的包。我重装开发机时就是靠这套配置先把常用包写进配置文件装系统之后一条命令全部恢复亲测在普通带宽下30多个软件大概半小时全部搞定。导出现有环境为配置文件choco list -lo -r --limit-output | ForEach-Object { $_ -replace \|, | }把输出拼接成上面的JSON格式存下来下次新机器直接吃这个文件。5.2 自动接受协议和跳过校验的参数组合在无人值守的批处理脚本里你肯定不想每装一个包都被提示确认一次。常用参数组合是-y --no-progress --skip-autouninstaller-y确认所有提示--no-progress取消进度条输出在脚本里避免刷屏--skip-autouninstaller跳过自动卸载器的确认提示部分包在升级时会要求确认是否运行卸载器。还有一个实用参数--ignore-checksums在下载包哈希校验失败时可以用它跳过校验。但要谨慎——跳过哈希校验等于放弃了完整性验证有安全风险我只在测试环境这么干过生产环境绝不推荐。5.3 打包自己的内网软件包Chocolatey最有价值的一点是你可以把自己的软件打包成choco包放到内网私有源上让全公司的人用choco install统一安装内部工具。先装打包工具choco install chocolatey -y choco new mytool这会生成一个mytool目录里面有mytool.nuspec包定义和tools目录下的chocolateyinstall.ps1安装脚本。编辑这两个文件把内部工具的分发包放到tools目录然后在chocolateyinstall.ps1里调用$toolsDir $(Split-Path -parent $MyInvocation.MyCommand.Definition) Install-ChocolateyZipPackage -PackageName mytool -Url $toolsDir\mytool.zip -UnzipLocation $(Join-Path $env:ProgramFiles MyTool)打包choco pack得到mytool.1.0.0.nupkg放到内网的NuGet服务器上推荐用BaGet或Nexus然后在客户端添加这个私有源choco source add -n internal -s http://nuget.internal.local/v3/index.json --priority2之后全网统一安装就变成了一条命令。我自己在维护公司Windows测试环境时就是用这套方案把内网的各种测试工具、内部证书、配置文件管理起来省去了大量手动部署的重复劳动。5.4 Chocolatey在CI/CD流水线中的用法在CI/CD里Windows构建节点需要预先装好编译工具链。用Chocolatey的好处是构建脚本里可以直接声明依赖节点每次构建前自检缺什么装什么# 构建脚本开头的依赖准备 choco install git -y --no-progress choco install dotnet-sdk --version8.0.100 -y --no-progress choco install nuget.commandline -y --no-progress配合--no-progress和-y在流水线里不会卡住等待输入。我还见过一种模式把整个构建节点的环境做成一个choco包流水线跑起来时先choco install buildagent一条命令把Node、Python、Java、CMake各种工具全装齐。这正是Chocolatey“一切皆脚本脚本可复用”的核心价值。6. 与其他方式对比什么时候该用Chocolatey什么时候不该用很多人会问Windows不是有Microsoft Store吗还有winget为什么还要用Chocolatey这个问题问得好我从实际使用角度做个对比。Chocolatey vs Microsoft StoreStore是美国区那种UWP应用的分发渠道桌面传统软件Win32程序的支持其实很有限。很多开发工具不在Store里或者Store里的是阉割版。另外Store的自动更新策略很迷你不能精确锁定某个版本。Chocolatey则完全面向传统桌面软件版本控制、批量安装、卸载管理都更符合开发者和运维的需求。Chocolatey vs wingetwinget是微软官方出的包管理器近几年发展很快。两者的核心区别有几点Chocolatey起步早包的数量和更新速度都占优Chocolatey支持真正的静默安装而winget部分包其实还是会弹出安装向导Chocolatey的包可以带安装参数比如指定安装目录winget的灵活度差一些另外Chocolatey的upgrade all和outdated这类批量管理命令winget目前还不够成熟。不过winget有个明显优势它是微软官方维护默认集成在较新的Windows里不需要额外安装。所以我的建议是个人电脑偶尔装几个软件用winget就行开发环境、测试环境、需要批量管理多台机器Chocolatey还是更顺手的方案。另外还有一类工具是Scoop它主打“绿色便携”不用管理员权限也能装软件装到用户目录适合不想动系统环境的场景。但Scoop的软件包数量比Chocolatey少一个数量级而且批量部署能力弱一些。我的混合用法是开发工具用Chocolatey装系统级环境个人小工具用Scoop装用户级程序互不干涉。7. 安全与维护别让包管理器成为后门7.1 如何判断一个包是否可信Chocolatey的软件包是社区维护的大部分主流软件包由官方维护者或受信任的社区成员发布。但和任何包管理器一样恶意包或仿冒包的风险客观存在。判断一个包是否可信第一步是打开包的详细页在Chocolatey社区网站上看这几个信息包名是否和官方软件一致版本号是否和官方发布节奏吻合安装脚本内容是否只做了正规安装操作。比如一个名为chrome的包它的chocolateyinstall.ps1里应该只有一个普通安装的调用来装Chrome如果脚本里有下载执行可疑exe的动作就必须警惕。更稳妥的方式是查看包的评价数和下载量主流包一般都有上百条评价和上万次下载。遇到下载量个位数的冷门包务必谨慎尽量用官方渠道装。7.2 开启病毒扫描配置Chocolatey支持安装前对下载包做哈希校验这个默认只校验下载完整性不校验内容安全性。如果你对安全要求高可以配置它调用系统杀毒软件扫描下载的安装包。以Windows Defender为例在choco config里可以设置choco config set --namevirusScannerType --valueVirusTotal choco config set --namevirusScannerVirusTotalApiKey --value你的APIKey或者使用Windows Defender的本地扫描choco config set --namevirusScannerType --valueWindowsDefender开启之后每次下载的包会先过一遍扫描再执行安装这层防护能拦住大部分恶意软件。7.3 定期维护清理旧版本和更新Chocolatey自身Chocolatey不会自动清理旧版本的安装包。装过一个软件的3个版本之后C:\ProgramData\chocolatey\lib里可能堆着几个版本的缓存文件。手动清理choco cleanup这个命令会删除不必要的旧版本包缓存。另外Chocolatey自身也会更新建议每月手动升级一次choco upgrade chocolatey -y理论上可以用choco upgrade all顺带把Chocolatey也升了但我会刻意分开——先升级Chocolatey自身再升级软件包避免出现兼容性问题时分不清是谁的问题。最后想分享一个我在实际操作中的体会Chocolatey这东西刚用的时候觉得它不过是个“命令行安装器”用得越深越发现它真正的价值在可重复性——环境应该被描述成代码而不是被记忆成一串手工操作。从一条命令装一个软件到一份JSON恢复整个开发环境再到内网私有源的统一分发这套玩法的边际收益是递增的。如果你还没试过建议先在测试机上配好镜像源装上几个高频软件感受一下然后慢慢把环境中重复的安装工作都挪到Chocolatey里来。