Интерпретаторы команд Windows cmd.exe
и Rar.exe
сами определяют, как аргументы, указанные в командной строке, интерпретируются при анализе командной строки. Строки аргументов, содержащие пробел или один из этих символов &()[]{}^=;!'+,`~<|>
, должны быть заключены в двойные кавычки. Это очень затрудняет передачу символа двойной кавычки как части строки аргумента в консольное приложение, особенно в начале строки аргумента.
Но есть решение для этой очень необычной и очень специфической проблемы, вызванной паролем/парольной фразой, начинающейся с прямого символа двойной кавычки, который обычно отмечает начало/конец строки аргумента внутри всех символов между ними, которые интерпретируются буквально.
Руководство по консольной версии WinRAR представляет собой текстовый файл Rar.txt
в папке программных файлов WinRAR. В этом руководстве можно прочитать, что Rar.exe
поддерживает чтение переключателей из переменной окружения RAR
. Используя эту переменную среды и специальный анализ интерпретатора командной строки Windows в командной строке SET, можно создать архив 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"
, как подробно объясняется в ответе на Почему после использования не выводится строка с 'echo %var%' 'установить var = text' в командной строке?
Пароль/парольная фраза с пробелом или одним из этих символов &()[]{}^=;!'+,`~<|>
должен быть заключен в двойные кавычки в командной строке 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, что означает имя пакетного файла с расширением и полным путем.
person
Mofi
schedule
14.01.2018