Windows 命令解释器cmd.exe 和Rar.exe 本身决定在解析命令行时如何解释命令行中指定的参数。包含空格或其中一个字符&()[]{}^=;!'+,`~<|> 的参数字符串必须用双引号引起来。这使得将双引号字符作为参数字符串的一部分传递给控制台应用程序变得非常困难,尤其是在参数字符串的开头。
但是对于这个由以直双引号字符开头的密码/密码短语引起的非常罕见且非常具体的问题,有一个解决方案,该字符通常标记参数字符串的开始/结束,其间的所有字符都按字面意思解释。
WinRAR控制台版的说明书是WinRAR程序文件夹下的文本文件Rar.txt。在本手册中可以看到Rar.exe 支持从环境变量RAR 中读取开关。通过在 SET 命令行上使用此环境变量和 Windows 命令行解释器的特殊解析,可以从命令行创建 RAR 存档,密码以单个直双引号字符开头。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "RAR=-hp""!(/!$!#!#=)\%%""
"%ProgramFiles%\WinRAR\Rar.exe" a -r -m0 -x"%~f0" "%USERPROFILE%\Desktop\files1.rar" *.*
endlocal
开关-hp 是从环境变量RAR 中读取的,以及手册中解释的直接在RAR 命令行上指定的其他开关。
环境变量RAR 使用语法set "variable=value" 定义,Why is no string output with 'echo %var%' after using 'set var = text' on command line? 上的答案详细解释了这一点
在 Windows 命令行中,需要将带有空格或其中一个字符 &()[]{}^=;!'+,`~<|> 的密码/密码用双引号括起来。出于这个原因,Rar.exe 从传递的密码/密码短语中删除第一个和最后一个双引号,如果在开头和/或结尾有一个。因此无法使用"!(/!$!#!#=)\% 定义密码。密码必须用两个额外的双引号使用""!(/!$!#!#=)\%" 定义,以让真正使用的密码以直双引号字符开头。
在批处理文件中,% 标记环境变量引用的开始/结束,除非它被另外一个 % 转义。
所以最后命令行set "RAR=-hp""!(/!$!#!#=)\%%"" 定义环境变量RAR 与开关-hp 将字符串"!(/!$!#!#=)\% 传递给Rar.exe 作为密码用于加密。
RAR 压缩包files1.rar 是通过此代码在用户桌面上创建的,因为目录C: 的根目录通常是写保护的。
注意:Rar 和 WinRAR 解释 *.* 与 * 不同,如手册中所述,与解释它们相同的 Windows 内核函数相比。 Rar 在使用*.* 时仅将文件名中包含点的文件添加到RAR 归档文件中。所以你最好只使用* 作为通配符。
如果在执行批处理文件时将批处理文件存储在当前目录中,则开关-x"%~f0" 可防止将批处理文件也添加到 RAR 存档文件中。在命令提示符窗口call /? 中运行%~f0 的解释 - 参数 0 的全名,表示带有扩展名和完整路径的批处理文件名。