多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

WinRAR命令行实战:批量压缩、加密与自动化脚本参数详解

WinRAR命令行实战:批量压缩、加密与自动化脚本参数详解 1. 为什么还要折腾 WinRAR 命令行很多人第一次听到WinRAR 命令行这个词第一反应是都什么年代了鼠标右键点一下不香吗我一开始也这么想直到有一次需要把三百多个按日期分好的文件夹分别打包成独立压缩包还要统一设置密码、统一分卷大小。手动操作的话光是右键菜单就要点上千次点到手抽筋都做不完。那次之后我才真正意识到图形界面适合偶尔用一次的场景而命令行才是批量、自动化、可复现场景下的正解。WinRAR 的命令行版本叫Rar.exe注意不是 WinRAR.exe它藏在 WinRAR 的安装目录里。这个工具能做的事情比大多数人想象的多得多压缩、解压、分卷、加密、修复损坏包、生成自解压程序、给压缩包加注释、转换压缩格式几乎图形界面能做的它都能做而且还能做图形界面做起来很别扭的事情比如按通配符批量处理、把结果输出成日志、嵌进批处理脚本里定时跑。这篇文章面向三类人一是需要批量处理压缩包的运维或数据整理人员二是想把压缩步骤写进自动化脚本的开发者三是单纯想搞清楚命令行参数到底怎么用、不想每次都去翻那本又长又枯燥的官方说明的普通用户。我会把常用参数按场景拆开讲配上能直接抄的示例再补充一些官方文档里不会写、但实际用起来很容易踩的坑。全文基于 WinRAR 6.x 和 7.x 版本的命令行行为简体中文环境下测试参数本身是英文的但我会用中文把每个参数的含义和用法讲透。需要先说明一点命令行参数是区分大小写的-r和-R在某些场景下含义不同这一点和很多 Linux 命令的习惯不一样后面会专门讲。另外Rar.exe 和 UnRAR.exe 是两个不同的可执行文件前者负责压缩和解压后者只负责解压如果你只需要解压功能用 UnRAR.exe 更轻量。2. 把 Rar.exe 请进命令行环境准备与第一个命令2.1 找到并配置 Rar.exe 的路径WinRAR 安装完之后Rar.exe 默认在安装目录下常见路径是C:\Program Files\WinRAR\。如果你在安装时勾选了将 WinRAR 添加到系统 PATH之类的选项那直接在命令行敲rar就能用如果没有就得手动把路径加进环境变量或者每次用完整路径调用。我个人的习惯是不改系统 PATH而是在脚本开头用一个变量存路径这样换机器的时候只改一行set RARC:\Program Files\WinRAR\Rar.exe %RAR% a -r backup.rar D:\data\*这样写的好处是路径里有空格也不会出问题因为整个路径被引号包住了。很多人踩的第一个坑就是路径带空格又没加引号命令行直接把C:\Program当成一个参数后面全乱了。验证是否配置成功敲一句rar如果输出了一屏帮助信息说明能用如果提示不是内部或外部命令那就是路径没配好。注意直接敲rar不带任何参数时它打印的是简要帮助想看完整帮助要用rar -?。2.2 命令的基本语法结构Rar.exe 的命令行语法可以概括成这个形式rar 命令 -开关1 -开关2 压缩包名 文件或路径列表这里有三块要分清楚。命令是动词比如a是添加addx是带路径解压extract with full pathe是不带路径解压d是从压缩包里删除t是测试压缩包完整性u是更新。开关是以短横线开头的修饰符控制压缩级别、密码、分卷、递归等行为。压缩包名和文件列表就是操作对象。举个最基础的例子把当前目录下的report.docx压成一个 rar 包rar a report.rar report.docx这条命令里a是添加命令report.rar是目标压缩包不存在会自动创建report.docx是要压进去的文件。执行完你会看到它打印出压缩进度、压缩率、耗时这些信息。2.3 一个容易被忽略的细节命令的默认行为这里有个新手特别容易困惑的点a命令在目标压缩包已存在时的行为。如果report.rar已经存在再执行一次rar a report.rar report.docx它不会覆盖整个包而是把report.docx更新进去。如果包里的同名文件比外面的旧它会替换如果一样新它会跳过。这个增量更新的特性在备份场景里非常有用但也容易让人误以为每次都是全新打包。如果你想强制重新打包得先删掉旧包或者用-ep1之类的开关配合但最干净的做法还是脚本里先del一下。我自己做每日备份时就是先判断日期生成带日期的包名这样天然不会冲突也方便回溯。3. 压缩场景的参数拆解从能压到压得好3.1 压缩级别-m0 到 -m5 到底差在哪WinRAR 的压缩级别用-m开关控制取值 0 到 5开关级别特点适用场景-m0仅存储不压缩只打包已经是压缩格式的文件如 jpg、mp4-m1最快速度优先压缩率低临时打包追求速度-m2快速速度和压缩率折中日常使用-m3标准默认级别大多数场景-m4较好压缩率较高归档长期保存-m5最好压缩率最高速度最慢对体积敏感、不赶时间很多人不知道的是对已经压缩过的文件图片、视频、mp3、zip 本身再用-m5去压几乎不会变小反而白白浪费时间。我实测过一批 jpg 照片-m5和-m0出来的包体积差不到 1%但耗时差了七八倍。所以正确的做法是混合内容用-m3或-m4纯媒体文件用-m0。3.2 递归与路径-r、-ep、-ap 的组合拳批量压缩时路径处理是最容易出错的地方。几个关键开关-r递归子目录。不加这个只压当前层文件。-ep从文件名中排除路径。-ep1排除基目录但保留子目录结构。-ap给压缩包内的文件加前缀路径。-ed不添加空目录。举个实际例子。假设目录结构是D:\project\src\a.txt和D:\project\src\sub\b.txt你想把src下的所有内容压进包并且包里不要出现src这一层rar a -r -ep1 project.rar D:\project\src\-r保证sub里的文件也被收进来-ep1把D:\project\src\这个基路径去掉包里直接就是a.txt和sub\b.txt。如果不加-ep1包里会多出一长串D:\project\src\...的完整路径解压出来一堆嵌套文件夹非常难看。注意-ep1和-ep2的区别经常被搞混。-ep1是排除基目录-ep2是连完整路径都保留。做发布包一般用-ep1。3.3 密码与加密-p 和 -hp 的安全差异给压缩包加密有两个开关差别很大-p密码设置密码但只加密文件内容文件名和目录结构还是可见的。-hp密码设置密码同时加密文件内容、文件名和头部信息没有密码连包里有什么文件都看不到。从安全角度-hp明显更强。但代价是一旦忘记密码-hp加密的包基本没救连文件列表都读不出来而-p加密的包至少还能看到文件名。我自己给敏感资料打包一律用-hp给普通分享用-p就够了。rar a -hpMySecret123 -m5 secure.rar D:\confidential\密码直接跟在开关后面中间不加空格。如果密码里有特殊字符建议用引号包起来避免被命令行解释。3.4 分卷压缩-v 的用法和单位分卷用-v开关后面跟大小单位可以是 b字节、k、m、g不写单位默认是字节。比如按 100MB 分卷rar a -v100m -m3 bigdata.rar D:\bigdata\生成的文件会是bigdata.part1.rar、bigdata.part2.rar这样。分卷大小要根据目标存储介质来定比如要刻盘就按 700m 或 4g要传网盘就按平台单文件限制来。这里有个经验分卷大小不要设得太接近介质上限留一点余量因为文件系统本身有开销卡得刚刚好反而容易失败。解压分卷包时只要对第一个分卷操作就行Rar 会自动找后续分卷rar x bigdata.part1.rar前提是所有分卷都在同一个目录下缺一个都会报错。4. 解压与维护x、e、t、d 的正确打开方式4.1 x 和 e 的区别一个保留路径一个不保留这是新手最容易搞混的一对命令。x是 extract with full path解压时保留压缩包内的目录结构e是 extract without path把所有文件都摊平到当前目录。假设包里有docs\readme.txt和docs\img\logo.pngrar x archive.rar解压出来是docs\readme.txt和docs\img\logo.png结构完整。rar e archive.rar解压出来是readme.txt和logo.png全在当前目录原来的docs和img都没了。什么时候用e当你只想要文件、不在乎目录结构的时候比如从一堆包里提取所有图片。但要注意如果不同子目录下有同名文件e会直接覆盖很容易丢数据。我一般默认用x除非明确知道包里没有重名。4.2 解压到指定目录-o 和输出路径解压时指定目标目录直接在命令末尾加路径rar x archive.rar D:\output\如果目标目录不存在Rar 会自动创建。这里有个开关-o控制覆盖行为-o覆盖已存在文件-o-不覆盖-o覆盖前询问交互模式下在脚本里跑的时候一定要显式指定-o或-o-否则遇到同名文件它会停下来等你输入脚本就卡死了。这是我早期写自动化脚本时踩过的坑半夜跑的任务卡在询问上第二天早上才发现。4.3 测试压缩包t 命令的实用价值t命令用来测试压缩包的完整性不实际解压只校验数据rar t archive.rar它会逐个文件校验 CRC最后报告全部正常或列出损坏的文件。这个命令在几个场景下特别有用一是下载完大压缩包后先测一遍确认没传坏二是备份归档定期抽检防止存储介质老化导致数据损坏三是解压报错时先用t定位是哪个文件坏了。我有个习惯重要备份包每隔几个月用t跑一遍配合日志记录能提前发现硬盘隐患。这个习惯帮我避免过一次因为硬盘坏道导致的备份失效。4.4 删除包内文件d 命令d命令从压缩包里删除指定文件rar d archive.rar temp.log支持通配符比如删掉所有 lograr d archive.rar *.log这个操作会重写整个压缩包所以对大包来说比较慢。如果只是临时排除某些文件更好的做法是打包时就用-x开关排除而不是事后删。5. 批量与自动化把 Rar 嵌进脚本的正确姿势5.1 用 for 循环批量打包回到开头那个三百个文件夹的场景用批处理可以这样写echo off set RARC:\Program Files\WinRAR\Rar.exe for /d %%i in (D:\data\*) do ( %RAR% a -m3 -ep1 D:\backup\%%~ni.rar %%i\ )这段脚本遍历D:\data\下的每个子目录用目录名作为压缩包名把每个目录单独打包。%%~ni取的是目录名不含路径-ep1保证包里不出现完整路径。这里有个细节for /d只遍历目录for不带/d遍历文件。如果你要按文件列表打包得用后者。另外批处理里的%%i在命令行直接跑时要写成%i这是批处理和命令行的语法差异很多人第一次写会懵。5.2 把结果输出到日志自动化任务一定要留日志否则出了问题无从查起。Rar 支持把输出重定向%RAR% a -m3 backup.rar D:\data\ D:\log\backup_%date:~0,4%%date:~5,2%%date:~8,2%.log 21把标准输出写进日志21把错误输出也合并进去。文件名里用日期做后缀方便按天归档。%date%的格式跟系统区域设置有关上面这种截取方式在简体中文 Windows 下通常能用但换语言环境可能失效稳妥的做法是用wmic或 PowerShell 取日期。5.3 返回值与错误处理Rar.exe 执行完会返回一个退出码脚本里可以据此判断成败退出码含义0成功1警告如文件被占用2致命错误3校验和错误5写错误6文件打开错误7命令行错误8内存不足9创建文件错误255用户中断在批处理里可以这样判断%RAR% a backup.rar D:\data\ if errorlevel 2 ( echo 打包失败退出码 %errorlevel% exit /b 1 )注意if errorlevel N的判断逻辑是大于等于 N所以判断失败要从 2 开始因为 1 只是警告不一定算失败。5.4 隐藏窗口运行如果脚本是给普通用户用的弹出一个黑窗口会显得很突兀。可以用start /min最小化或者用 VBScript 包装成完全隐藏start /min cmd /c backup.bat更彻底的方式是写个 vbs 调用但那个稍微复杂日常用/min就够了。这里要提醒一句隐藏窗口运行的任务一定要确保日志写全否则出了问题用户看不到任何提示你也无从排查。6. 那些官方文档不会告诉你的坑6.1 中文路径和文件名的编码问题在简体中文 Windows 下命令行默认代码页是 936GBK。如果你的文件路径里有中文而脚本文件本身存成了 UTF-8就会出现乱码Rar 找不到文件。解决办法有两个一是把批处理文件存成 ANSI 编码二是在脚本开头加chcp 936显式指定代码页。我遇到过最诡异的一次是脚本在本地跑没问题放到另一台机器上就报找不到文件查了半天发现是那台机器的区域设置不同代码页不一样。从那以后我的脚本开头一律加chcp 936省心。6.2 文件被占用时的行为如果待压缩的文件正被其他程序打开比如 Excel 正在编辑Rar 默认会报警告并跳过退出码是 1。在备份场景里这可能导致备份不完整。稳妥的做法是备份前先确认没有程序占用或者用支持卷影复制的工具配合。Rar 本身不提供卷影复制功能这是它的一个局限。6.3 压缩包内的路径分隔符Windows 用反斜杠\但 Rar 压缩包内部统一用正斜杠/存储路径。这本身不是问题但如果你用-ap开关手动指定包内路径要注意写正斜杠写反斜杠可能不生效。这个细节在跨平台解压时尤其重要因为 Linux 下反斜杠是转义字符。6.4 大文件与分卷的边界分卷压缩时如果单个文件本身就比分卷大小还大Rar 会把它拆到多个分卷里这是正常的。但有些老版本的工具解压这种跨卷大文件会出问题所以如果目标用户用的解压工具比较老建议分卷大小设得比最大单文件还大避免跨卷。6.5 密码中的特殊字符密码里如果有空格、引号、、|这些命令行特殊字符直接跟在-p后面会被解释。正确做法是用引号包起来rar a -pMy PassWord archive.rar files\但引号本身如果也是密码的一部分就更麻烦得用转义。我的建议是自动化场景下密码尽量用字母数字组合别用特殊字符能省掉一大堆转义问题。7. 几个高频场景的完整命令模板7.1 每日全量备份并保留最近七天echo off chcp 936 set RARC:\Program Files\WinRAR\Rar.exe set BACKUP_DIRD:\backup set SRC_DIRD:\data %RAR% a -m4 -r -ep1 %BACKUP_DIR%\daily_%date:~0,4%%date:~5,2%%date:~8,2%.rar %SRC_DIR%\ forfiles /p %BACKUP_DIR% /m daily_*.rar /d -7 /c cmd /c del path这段脚本先打包再用forfiles删掉七天前的包。forfiles是 Windows 自带的不用额外装东西。7.2 给压缩包加注释rar c -zcomment.txt archive.rarc是添加注释命令-z指定注释文件。注释在图形界面里能看到适合给归档包加说明。7.3 生成自解压程序rar a -sfx archive.exe files\-sfx开关生成自解压 exe接收方不用装 WinRAR 也能解压。默认用的是 WinRAR 自带的 SFX 模块如果想自定义图标和界面需要额外指定-iicon和-iimg。7.4 修复损坏的压缩包rar r archive.rarr是修复命令会尝试重建损坏的压缩包。如果包损坏严重还可以用-rr开关在打包时就加入恢复记录提高容错rar a -rr5 archive.rar files\-rr5表示加入 5% 的恢复记录包会稍微大一点但抗损坏能力明显提升。重要归档我一般都会加恢复记录。8. 我个人的使用体会折腾 WinRAR 命令行这些年最大的感受是参数本身不难难的是把参数组合对并且让脚本在各种环境下都能稳定跑。官方帮助文档列了几百个开关但真正高频用的就那么二十来个把常用的吃透剩下的用到再查就行。另一个体会是自动化脚本一定要有日志和错误处理。我早期写的脚本图省事什么都不判断结果有一次磁盘满了打包失败脚本却继续往下跑把旧的备份删了数据差点没找回来。从那以后我的脚本里每个关键步骤都有退出码判断失败就停绝不带病往下走。还有一点命令行工具的价值在于可复现。图形界面点出来的操作换个人、换台机器就得重新摸索而一条命令写下来谁都能照着跑结果一致。这也是为什么我后来把很多重复性的文件处理工作都改成了命令行脚本一次写好长期受益。如果你刚开始接触建议从最简单的a和x开始先跑通一两个例子再逐步加-r、-m、-p这些开关。每加一个参数都想想它改变了什么行为时间长了自然就熟了。别一上来就抄一堆复杂命令出了问题都不知道是哪块引起的。
返回列表