1. 为什么还要折腾 WinRAR 命令行
很多人第一次听到“WinRAR 命令行”这五个字,第一反应是:都什么年代了,鼠标右键点一下不香吗?我一开始也这么想,直到有一次需要把三百多个按日期命名的文件夹分别打包成独立压缩包,还要统一设置密码、统一分卷大小。手动操作到第十几个的时候我就放弃了,手指点右键点到发酸,而且每次弹出来的广告窗口还得手动关。从那次之后,我才真正把 WinRAR 的命令行模式当回事。
WinRAR 的命令行版本叫Rar.exe和WinRAR.exe,前者是纯控制台程序,后者带图形界面但支持命令行参数。两者都放在 WinRAR 的安装目录下,默认路径通常是C:\Program Files\WinRAR\。命令行模式能做的事情,本质上和图形界面完全一样——压缩、解压、加密、分卷、修复、生成自解压包,只是把鼠标点击换成了参数输入。它的核心价值在于批量处理和自动化集成:你可以把命令写进 bat 脚本,挂到计划任务里,或者嵌入到自己的程序流程中,让压缩这件事彻底不需要人盯着。
这篇文章适合三类人看:第一类是经常需要批量打包的运维或测试人员,第二类是想把压缩步骤集成到自动化流程里的开发者,第三类是对命令行有兴趣、想找一个具体场景练手的普通用户。我会从参数逻辑讲到实操脚本,把踩过的坑和验证过的方案都摊开说,尽量让没接触过命令行的人也能跟着做下来。
注意:本文所有操作基于 Windows 平台,WinRAR 版本以 6.x 和 7.x 为主。不同版本之间参数基本兼容,但个别新增参数我会单独标注。
2. 命令行工具的选择与基础准备
2.1 Rar.exe 和 WinRAR.exe 到底用哪个
这是最先要搞清楚的问题。安装目录下有两个可执行文件,名字很像,用途有区别。
Rar.exe是纯命令行程序,运行时不弹任何窗口,适合放在脚本里静默执行。它支持绝大多数压缩和解压参数,但不支持生成自解压包,也不支持一些和图形界面强相关的操作。如果你只是做压缩、解压、加密、分卷,用Rar.exe就够了,而且它不会触发任何广告弹窗。
WinRAR.exe带图形界面,但同样接受命令行参数。当你需要生成自解压 exe 文件,或者需要调用一些只有图形界面才有的功能时,就得用它。它的缺点是执行时会短暂弹出窗口,虽然可以通过参数让它自动关闭,但在纯后台场景下不如Rar.exe干净。
我的建议是:日常批处理一律用Rar.exe,只有做自解压包时才用WinRAR.exe。这样既避免了广告干扰,也让脚本行为更可预测。
2.2 把命令加到系统路径里
每次敲命令都要写完整路径太麻烦,比如"C:\Program Files\WinRAR\Rar.exe" a ...。解决办法是把 WinRAR 安装目录加到系统环境变量Path里。
操作步骤:右键“此电脑” → 属性 → 高级系统设置 → 环境变量 → 在“系统变量”里找到Path→ 编辑 → 新建 → 填入C:\Program Files\WinRAR\→ 一路确定。完成后打开新的命令行窗口,直接输入rar回车,如果能看到版本信息和用法说明,就说明配置成功了。
提示:修改环境变量后必须重新打开命令行窗口才生效,已经开着的窗口读的还是旧路径。
2.3 验证安装与查看帮助
配置好之后,先跑一条最简单的命令确认环境正常:
rar不带任何参数时,Rar.exe会输出当前版本号和一份简短的参数列表。想看完整帮助可以输入rar -?,不过输出内容很长,建议重定向到文件里慢慢看:
rar -? > rar_help.txt这个帮助文件是英文的,但参数含义都比较直白。下面我会把常用参数逐个拆开讲,配合实际例子,比啃帮助文件快得多。
3. 核心参数逐个拆解
3.1 命令的基本结构
WinRAR 命令行的语法结构是这样的:
rar <命令> -<开关1> -<开关2> <压缩包名> <文件或文件夹列表>拆开看就是四部分:命令决定做什么操作,开关是可选的行为修饰,压缩包名是目标文件,文件列表是要处理的源。命令和开关之间、开关和文件名之间都用空格隔开。开关以短横线开头,多个开关可以连着写,也可以分开写。
举个最简例子:
rar a backup.rar D:\projects\demo这条命令的意思是:把D:\projects\demo这个文件夹压缩成当前目录下的backup.rar。a是添加命令,表示把文件加入压缩包。
3.2 最常用的五个命令
命令是整条语句的动词,决定了操作类型。下面这五个覆盖了九成以上的日常需求。
| 命令 | 含义 | 典型场景 |
|---|---|---|
a | 添加文件到压缩包 | 创建新压缩包或追加文件 |
x | 解压并保留目录结构 | 还原完整文件夹 |
e | 解压到当前目录不保留路径 | 只取文件不要层级 |
l | 列出压缩包内容 | 查看里面有什么 |
d | 从压缩包删除文件 | 移除不需要的条目 |
a命令最常用,它有个特点:如果目标压缩包不存在就创建,存在就往里追加。这意味着你重复执行同一条a命令,不会覆盖已有内容,而是把新文件加进去。想强制重建就得先删掉旧包,或者用-ep1之类的开关控制路径行为。
x和e的区别新手最容易搞混。假设压缩包里有个src\main.py,用x解压会得到src\main.py这个完整路径,用e解压则只得到main.py,目录结构被拍平了。还原项目用x,只想要里面的文件用e。
3.3 开关参数:控制行为的旋钮
开关是 WinRAR 命令行的精髓,也是最能体现灵活性的地方。下面按功能分组说。
压缩控制类:
-m0到-m5:压缩级别,0 是不压缩只打包,5 是最大压缩。默认是-m3。级别越高越慢,但体积越小。实测文本类文件从 3 提到 5 能再小百分之几,但耗时可能翻倍,视频图片这类已经压缩过的文件提升几乎为零。-s:创建固实压缩包。固实压缩会把所有文件当成一个连续数据流来压,对小文件多的场景效果明显,但缺点是解压单个文件时要先解压它前面的所有数据,随机读取变慢。-md<大小>:字典大小,比如-md64m表示 64MB 字典。字典越大压缩率越高,但内存占用也越大。一般-md32m到-md128m够用。
密码与加密类:
-p<密码>:设置密码。比如-pMyPass123。注意密码直接写在命令里会留在历史记录中,敏感场景建议用-p不带参数,执行时会提示输入。-hp<密码>:不仅加密数据,还加密文件头。这样别人连压缩包里有哪些文件名都看不到,安全性更高。
分卷与路径类:
-v<大小>:分卷压缩。比如-v100m表示每个分卷 100MB。生成的文件名会是backup.part1.rar、backup.part2.rar这样。-ep1:从文件名中排除基目录。打包文件夹时不想让压缩包里多一层外层目录,就用这个。-r:递归处理子目录。打包文件夹时基本都要加。
静默与日志类:
-ibck:后台运行,不显示进度窗口。-inul:不显示任何消息,包括错误。慎用,出错了你都不知道。-log<文件名>:把操作日志写到指定文件,排查问题时很有用。
3.4 参数组合的实际效果
单个参数好理解,组合起来才是真实用法。举几个我常用的组合:
rar a -m5 -md128m -s -r -ep1 project_backup.rar D:\work\myproject这条命令做了这些事:最大压缩级别、128MB 字典、固实压缩、递归子目录、排除基目录,把myproject文件夹压成project_backup.rar。适合归档不常动的项目源码。
rar a -v200m -p -hp -m3 bigdata.rar D:\exports\*这条把D:\exports\下所有文件分卷压缩,每卷 200MB,执行时会提示输入两次密码,数据加密加文件头加密。适合需要分卷传输又要求保密的数据。
4. 实操场景与完整脚本
4.1 场景一:按日期批量打包文件夹
回到我开头提到的那个需求:三百多个按日期命名的文件夹,每个单独打包。假设文件夹都在D:\daily\下,名字是20240101、20240102这种格式。
手动做是不可能的,写个 bat 脚本:
@echo off setlocal enabledelayedexpansion set SRC=D:\daily set DST=D:\packed if not exist "%DST%" mkdir "%DST%" for /d %%i in ("%SRC%\*") do ( set FOLDER=%%~ni echo 正在打包 !FOLDER! ... rar a -m3 -r -ep1 "%DST%\!FOLDER!.rar" "%%i" ) echo 全部完成 pause逐段解释:setlocal enabledelayedexpansion开启延迟变量扩展,这样在 for 循环里才能正确读取每次变化的变量。for /d遍历目录,%%~ni取文件夹名不带路径。rar a那行把每个文件夹压成同名的 rar 文件,-ep1保证压缩包里不会多一层daily目录。
实测三百多个文件夹跑下来大概几分钟,取决于文件大小和压缩级别。如果嫌慢可以把-m3降到-m1,体积会大一些但速度快不少。
注意:bat 脚本里的
%%i在命令行直接执行时要写成%i,在脚本文件里才是%%i。这个坑我踩过不止一次。
4.2 场景二:定时自动备份并分卷
假设有个数据库导出目录D:\dbbackup\,每天凌晨生成一个 dump 文件,需要自动压缩并分卷成 500MB 一卷,保留最近七天的包。
用 Windows 计划任务配合 bat 脚本:
@echo off set SRC=D:\dbbackup set DST=E:\archive set DATE=%date:~0,4%%date:~5,2%%date:~8,2% rar a -m5 -v500m -r "%DST%\db_%DATE%.rar" "%SRC%\*" forfiles /p "%DST%" /m "db_*.rar" /d -7 /c "cmd /c del @path"%date:~0,4%这种写法是截取日期字符串,不同系统区域设置下格式可能不一样,稳妥的做法是用wmic os get localdatetime或者 PowerShell 取日期。forfiles那行负责删除七天前的旧包,/d -7表示七天前。
把这段存成backup.bat,然后在计划任务里设置每天凌晨两点执行。分卷文件会生成db_20240101.part1.rar、db_20240101.part2.rar这样,解压时只要选中第一个分卷,WinRAR 会自动找齐其余部分。
4.3 场景三:解压时只取需要的文件
有时候拿到一个大压缩包,只想要里面某类文件。比如一个包含各种资源的包,只想要所有.json配置。
rar x -n*.json archive.rar D:\extracted\-n*.json是文件过滤开关,只解压匹配这个模式的文件。x保留目录结构,解压到D:\extracted\下。如果想排除某类文件,用-x开关,比如-x*.tmp排除所有临时文件。
这个技巧在处理别人发来的杂包时特别省事,不用先全部解压再手动挑。
4.4 场景四:生成自解压包
给不装 WinRAR 的人发文件时,自解压包最方便。这必须用WinRAR.exe:
WinRAR.exe a -sfx -m5 setup_package.exe D:\release\*-sfx开关告诉 WinRAR 生成自解压格式。生成出来的setup_package.exe双击就能解压,不需要目标机器装任何压缩软件。默认的自解压模块界面比较朴素,如果想自定义图标和解压路径,需要先用图形界面生成一个自解压包,再通过-iicon和-iimg参数替换资源,这部分命令行支持有限,复杂定制还是得靠图形界面。
提示:自解压包容易被安全软件误报,内部使用没问题,对外分发前最好先测试一下。
5. 常见问题与排查技巧
5.1 中文乱码问题
这是中文用户遇到最多的问题。命令行窗口默认代码页是 936(GBK),而 WinRAR 内部用 Unicode 处理文件名。当压缩包里包含中文文件名,或者源路径有中文时,可能出现乱码。
解决办法有两个。一是在 bat 脚本开头加chcp 65001切换到 UTF-8 代码页,但这样可能导致其他中文程序显示异常。二是用-sc<字符集>开关指定字符集,比如-scuc表示 Unicode。实测在 WinRAR 6.x 以上版本,只要系统区域设置正确,中文路径基本不会出问题,乱码更多出现在跨平台传输后的解压环节。
如果解压出来的中文名是乱码,试试加-scuc参数重新解压。
5.2 路径中有空格怎么办
路径带空格是命令行最常见的坑。比如C:\Program Files\这种。解决办法是用双引号把路径包起来:
rar a "my backup.rar" "D:\my projects\demo"压缩包名和源路径都要加引号。如果路径里本身有引号,那就更复杂了,不过正常文件系统里不会出现这种情况。
5.3 压缩包被占用无法操作
有时候执行命令报错说文件被占用,通常是因为压缩包正被其他程序打开,或者上一次操作还没完全结束。排查思路:先确认没有 WinRAR 窗口开着这个包,再检查有没有杀毒软件在扫描。如果是在脚本里连续操作同一个包,可以在命令之间加个短暂延时,或者用-o+开关强制覆盖。
-o+表示覆盖已有文件,-o-表示跳过,-or表示自动重命名。批量处理时建议用-o+,避免脚本卡在交互提示上。
5.4 命令执行了但没效果
这种情况多半是参数顺序或拼写问题。WinRAR 对参数顺序有一定要求:命令在最前,开关在命令之后、文件名之前。如果把开关写在文件名后面,可能被当成文件名处理。
另一个常见原因是-r忘了加。打包文件夹时如果不加-r,只会打包文件夹本身,里面的内容不会递归进去。我见过有人打包出来一个空壳,排查半天才发现是漏了递归开关。
5.5 常见问题速查表
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 中文文件名乱码 | 代码页不匹配 | 加-scuc或脚本开头chcp 65001 |
| 提示找不到路径 | 路径含空格未加引号 | 用双引号包裹路径 |
| 压缩包为空 | 漏了-r递归开关 | 加上-r |
| 文件被占用 | 其他程序打开中 | 关闭占用程序或用-o+ |
| 分卷解压失败 | 分卷文件不全 | 确认所有 part 文件在同一目录 |
| 密码错误 | 大小写或特殊字符 | 检查-p后的密码,注意 shell 转义 |
| 自解压包被杀软拦截 | 误报 | 添加信任或改用普通压缩包 |
5.6 几个少有人提的实用技巧
第一个技巧:用-ed开关排除空目录。打包时如果源里有很多空文件夹,加上这个开关能让压缩包干净不少。
第二个技巧:-ag开关可以自动生成带日期时间的文件名。比如rar a -agYYYYMMDD backup.rar D:\data会生成backup20240101.rar,省去自己拼日期字符串的麻烦。
第三个技巧:查看压缩包内容时用rar lb archive.rar,lb命令只输出文件名列表,不带其他信息,方便管道传给其他程序处理。比如配合findstr搜索特定文件:
rar lb archive.rar | findstr ".json"第四个技巧:修复损坏的压缩包用rar r archive.rar,如果普通修复不行,用rar r -rr尝试重建。修复成功率取决于损坏程度,但值得一试。
6. 把命令行用顺手的几点体会
我从最开始抵触命令行,到现在几乎所有压缩操作都走脚本,中间大概经历了半年。最大的感受是:命令行的价值不在单次操作,而在重复操作。一次压缩用鼠标确实快,但当你需要做一百次同样的压缩时,脚本的优势就碾压式地体现出来了。
另一个体会是参数不用一次记全。我到现在也记不住所有开关,常用的就那十几个,其他的需要时查帮助或者翻自己整理的笔记。关键是要理解每个参数背后的逻辑——为什么要有-ep1,为什么x和e要分开,为什么固实压缩对小文件有效——理解了逻辑,参数自然就记住了。
还有一点:脚本写完一定要先拿小批量数据测试。我有次直接对生产目录跑批量压缩,结果因为-ep1的位置写错,压缩包里多了一层目录,解压时路径全乱了。后来养成的习惯是,任何新脚本先在一个测试文件夹上跑一遍,确认输出符合预期再上真实数据。
最后分享一个我常用的命令模板,基本覆盖了日常大部分需求:
rar a -m5 -r -ep1 -o+ -logbackup.log "输出包名.rar" "源路径"需要加密就加-p,需要分卷就加-v,需要固实就加-s。这个模板我用了很久,稳定可靠,推荐你也存一份。