把 Arch Linux 的 pacman 命令行体验移植到 Windows:相同的语法、相同的帮助文本、 相同的输出风格和确认提示,底层把每条命令翻译成 winget (Windows 包管理器)调用。
PS C:\> pacman -Ss vim
winget/Vim.Vim 9.1.0652
Vim
winget/Neovim.Neovim 0.10.0
Neovim
winget/Git.Git 2.47.0 [installed]
Git
PS C:\> pacman -Syu
:: Synchronizing package databases...
:: Starting full system upgrade...
:: Proceed with installation? [Y/n]
语法、用法文本(-h 输出)、错误信息、退出码均对照 pacman 7.x 官方源码逐条实现
(对照参考为 gitlab.archlinux.org/pacman/pacman 的公开源码,本仓库不包含其快照)。
- Windows 10 1709+ / Windows 11
- winget ≥ 1.4(App Installer 自带)
- Windows PowerShell 5.1 或 PowerShell 7+(可选,
pacman.cmd会自动优先使用 pwsh)
方式一:MSI 安装包(推荐)——直接双击 dist\WinPac-<版本>-x86.msi,或:
msiexec /i dist\WinPac-1.0.0-x86.msiMSI 为单包双上下文授权(ALLUSERS=2 + MSIINSTALLPERUSER=1):普通用户权限安装
即为每用户安装(无需 UAC);以管理员身份安装则为全机安装。安装后同样需要
打开新的终端窗口让 PATH 生效。卸载走"设置 → 应用"或 msiexec /x。
已知限制:MSI 卸载后可能在用户 PATH 中残留一个指向已删除目录的空条目
(无害;需要绝对干净可改用下方 uninstall.ps1)。
方式二:脚本安装——
git clone <本仓库> winpac
cd winpac
powershell -NoProfile -ExecutionPolicy Bypass -File install.ps1安装脚本会把 pacman.cmd + pacman.ps1 复制到
%LOCALAPPDATA%\Programs\WinPac 并加入用户 PATH。
打开新的终端窗口,然后:
pacman -V卸载:powershell -File uninstall.ps1。
也可以不做安装,直接在仓库目录里运行 .\pacman.ps1 或 .\pacman.cmd。
| pacman 命令 | 实际执行 | 说明 |
|---|---|---|
pacman -Ss <词> |
winget search <词> |
搜索远程仓库;输出格式仿 pacman(repo/Id 版本 + 缩进描述行),已安装的标记 [installed];支持正则(winget 子串搜索无结果且含正则元字符时自动回退全表正则过滤) |
pacman -S <pkg> |
winget install <pkg> |
安装;先显示 Packages (N) 摘要并询问 Proceed with installation? [Y/n] |
pacman -S --needed <pkg> |
winget install <pkg> |
已装且最新则输出 warning: xxx is up to date -- skipping(跳过重装) |
pacman -S <pkg>(已安装) |
自动追加 --force 重装 |
模拟 pacman 的重装语义,输出 warning: xxx is already installed -- reinstalling |
pacman -Si <pkg> |
winget show <pkg> |
查看远程包信息 |
pacman -Sl [repo] |
winget search [--source repo] |
列出仓库内容;repo 仅接受 winget / msstore,否则报 error: repository 'x' not found |
pacman -Sy |
winget source update |
刷新软件源 |
pacman -Su / pacman -Syu |
winget source update + winget upgrade --all --include-unknown |
全系统升级 |
pacman -Sw <pkg> |
winget download <pkg> |
只下载不安装(确认提示 Proceed with download?) |
pacman -Sc / -Scc |
删除 %TEMP%\WinGet 安装包缓存(-Scc 另清理 winget LocalCache) |
交互与 pacman 一致:-Sc 默认 Y,-Scc 默认 N |
pacman -R <pkg> |
winget uninstall <pkg> |
卸载;checking dependencies... + Do you want to remove these packages? [Y/n] |
pacman -Rns <pkg> |
winget uninstall <pkg> |
-n/-s/-c/-u/-d 被接受但忽略(winget 无依赖图),给出警告 |
pacman -Q |
winget list |
列出已安装 |
pacman -Q <pkg> |
表内精确匹配 | 未找到时报 error: package 'x' was not found |
pacman -Qq |
输出包 Id | 仿 pacman -Qq 只输出名字 |
pacman -Qi <pkg> |
winget show <pkg> |
查看已装包信息 |
pacman -Qs <正则> |
winget list + 本地正则过滤 |
输出 local/Id 版本 + 缩进描述行 |
pacman -Qu |
winget upgrade |
列出可升级的包 |
pacman -Qm |
winget list 中无 Source 的行 |
"外来"包(非 winget/msstore 安装的程序) |
pacman -Qn |
winget list 中有 Source 的行 |
"原生"包 |
pacman -Qp <file> |
winget show --manifest <file> |
查询本地清单文件 |
pacman -T <pkg>... |
逐个对照 winget list |
缺失的打印名字并 exit 127(与 pacman 一致,可供脚本检查依赖) |
pacman -U <pkg.msix> |
Add-AppxPackage <pkg.msix> |
安装本地 MSIX 包(也支持 .appx / .appxbundle) |
pacman -U <目录> |
winget install --manifest <目录> |
安装本地 winget 清单目录 |
pacman -V / pacman -h / pacman -Sh … |
— | 与 pacman 相同的版本横幅和帮助文本 |
--noconfirm |
--accept-package-agreements --accept-source-agreements --disable-interactivity |
免交互 |
--debug |
--verbose-logs |
|
-p / --print |
只打印目标,不执行 | 与 pacman 一致 |
pacman -S pkg1 pkg2 - < list.txt |
从 stdin 读取目标 | 与 pacman 一致(重定向时) |
不支持的 pacman 功能(调用时报 pacman 风格错误):-D、-F、-Ql、-Qo、-Qk、
-Qc、-Sg/-Qg —— winget 不维护包的文件清单、分组、changelog 和依赖图,
这些没有诚实映射就明确报错,而不是给出误导性输出。
- 依赖解析:winget 没有依赖图,所有依赖相关旗标(
-Sd、-Rs、-Rns…)接受但忽略并警告。 -Su细节:pacman -Syu <pkg>会先winget upgrade --all再逐个安装目标包。- 包名约定:pacman 风格输出中用 winget 的 Id(如
Git.Git)对应 pacman 的包名, Name 作为描述行。 - 已装标记:
-Ss的[installed]通过比对winget list获得,会多一次查询。 - 本地化输出:winget 表头为非英文(如中文「名称/ID/版本」)时按列位置解析,
-Ss/-Qq/-Qs/-Qm/-Qn/-T等解析型命令在本地化系统上同样工作;调用 winget 时 一律按 UTF-8 解码(winget ≥ 1.4 恒定输出 UTF-8)。 - MSI 卸载残留:通过 msiexec 卸载 MSI 时,Windows Installer 不会移除它写入
的用户 PATH 条目(
msi/winpac.wxs.in与 wixl 构建版行为一致),残留条目指向 已删除的目录、无害;需要干净移除请用uninstall.ps1。 - 权限:不像 pacman 要求 root,winget 自行处理每用户/每机器安装与 UAC 弹窗。
winpac/
├── pacman.ps1 主程序:参数解析(仿 pacman.c 的 getopt 逻辑)+ winget 映射
├── pacman.cmd cmd 垫片:让 cmd / PowerShell / Windows Terminal 都能用 pacman
├── install.ps1 安装到 %LOCALAPPDATA%\Programs\WinPac 并加 PATH
├── uninstall.ps1 卸载
├── msi/ MSI 安装包构建
│ ├── build.ps1 Windows 构建(WindowsInstaller COM + makecab,零依赖、免管理员)
│ ├── build.sh Linux 构建(wixl / msitools,用于 CI)
│ ├── winpac.wxs.in MSI 定义源文件(两种构建共用同一布局)
│ └── winpac.ico 产品图标
├── dist/ 构建产物(WinPac-<版本>-x86.msi)
├── tests/run-tests.ps1 干跑测试套件(无需 Windows)
└── README.md
设置 WINPAC_DRY_RUN=1 后,所有 winget 调用只打印不执行,并用内置的模拟表驱动
-Q/-Ss 等解析逻辑,因此整套测试在任何装有 PowerShell 的系统上都能跑:
pwsh -NoProfile -File tests/run-tests.ps1 # 81 项断言构建 MSI(版本号取自 pacman.ps1 的 $script:VERSION,单一事实来源):
pwsh -NoProfile -File msi/build.ps1 # Windows:输出 dist/WinPac-<版本>-x86.msi
bash msi/build.sh # Linux:wixl 构建等价 MSI主程序兼容 Windows PowerShell 5.1(未使用三元运算符、?? 等 7.x 专属语法)。
MIT(见 LICENSE)。pacman 语法与文案的对照实现参考了 pacman(GPL-2.0)的公开源码, 本项目不包含其代码。