Пакетное декодирование base64

Я пытаюсь сделать установщик, используя пакет. Конечно, установщик должен состоять из файлов, которые будут установлены, поэтому я думаю закодировать файлы в base64, а просто их раскодировать и записать по назначению.

Конечно, моя работа была бы очень легкой, если бы в Windows было что-то вроде инструмента base64, который содержится в коробках Linux. Однако, поскольку его просто нет, есть ли способ полностью декодировать содержимое base64 с помощью пакетных файлов? И как бы мне этого добиться?

Любая помощь приветствуется.

(Это просто эксперимент, поэтому я не беспокоюсь о неэффективности и тому подобном.)


person user2064000    schedule 05.06.2013    source источник
comment
Также проверьте это: f2ko.de/en/b64.php   -  person David Refoua    schedule 31.08.2016
comment
Этот комментарий был моим любимым ответом, эта программа больше похожа на работу с Linux.   -  person neokyle    schedule 10.12.2018


Ответы (2)


На самом деле в Windows есть утилита, которая кодирует и декодирует base64 — CERTUTIL.

Я не уверен, какая версия Windows представила эту команду.

Чтобы закодировать файл:

certutil -encode inputFileName encodedOutputFileName

Чтобы расшифровать файл:

certutil -decode encodedInputFileName decodedOutputFileName

Для CERTUTIL доступно несколько глаголов и опций.

Чтобы получить список почти всех доступных глаголов:

certutil -?

Чтобы получить помощь по определенному глаголу (например, -encode):

certutil -encode -?

Чтобы получить полную справку почти для всех глаголов:

certutil -v -?

Как ни странно, глагол -encodehex не указан вместе с certutil -? или certutil -v -?. Но это описано с помощью certutil -encodehex -?. Еще одна удобная функция :-)

Обновлять

Что касается комментария Дэвида Моралеса, то существует плохо документированный type option для глагола -encodehex, который позволяет создавать строки base64 без строк заголовка или нижнего колонтитула.

certutil [Options] -encodehex inFile outFile [type]

Тип 1 даст base64 без строк заголовка или нижнего колонтитула.

См. https://www.dostips.com/forum/viewtopic.php?f=3&t=8521#p56536 для краткого списка доступных форматов типов. А для более подробного ознакомления с доступными форматами см. https://www.dostips.com/forum/viewtopic.php?f=3&t=8521#p57918.

Не исследовано, но глагол -decodehex также имеет необязательный завершающий аргумент типа.

person dbenham    schedule 05.06.2013
comment
Certutil существует по крайней мере с Windows Server 2003. - person David Ruhmann; 05.06.2013
comment
Я бы дал хорошие шансы на то, что base64 в пакетном режиме был самой отчаянной вещью, которую я когда-либо вводил в поисковой системе. - person nik.shornikov; 16.08.2013
comment
@DavidRuhmann - Действительно, однако, FWIW, двоичный файл 2003 можно было установить и использовать в Windows 2000. - person Greenonline; 26.12.2015
comment
запуск certutil -encode inputFileName encodedOutputFileName генерирует строку base64, заключенную в -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----, поэтому вы не можете напрямую декодировать файл после его создания. - person David Morales; 21.01.2016
comment
@DavidMorales - Неправда! Вы пробовали? Команда -DECODE прекрасно работает с верхним и нижним колонтитулами. Я не уверен в точных правилах, но CERTUTIL -DECODE очень снисходительно относится к формату закодированного источника. - person dbenham; 21.01.2016
comment
@dbenham Я не пытался декодировать с помощью certutil, но другие декодеры не будут работать с неправильными ошибками заполнения из-за этих двух строк (которые я пробовал). - person David Morales; 21.01.2016
comment
Справедливо, но я думаю, что установщик для Windows должен использовать родные инструменты WIndows, т.е. CERTUTIL. Но хорошо, что люди понимают, что в выводе -ENCODE содержится дополнительная информация. При желании очень легко удалить строки заголовка и нижнего колонтитула через findstr /v /c:- certutilOutput.txt >cleanOutput.txt. - person dbenham; 21.01.2016
comment
ИМХО certutil сломан. В моем случае это работает для небольших файлов, но я пробовал это с файлами размером 90 МБ, и результат такой: CertUtil: команда -encodehex FAILED: 0x80070216 (WIN32: 534) CertUtil: арифметический результат превысил 32 бита. - person Andrzej Martyna; 29.08.2016
comment
@AndrzejMartyna - дело не в том, что он сломан, но максимальный размер входного файла составляет 74472684 байта. - person SomethingDark; 03.10.2016
comment
@SomethingDark, спасибо! это ценная информация, но интересно, где вы нашли этот предел? Я остаюсь при своем мнении, что certutil не работает, потому что (1) ограничение должно быть четко задокументировано для пользователя или (2) ограничения не должно быть. - person Andrzej Martyna; 04.10.2016
comment
@AndrzejMartyna - я согласен, что ограничений быть не должно :) Я тестировал скрипт, который написал, который включал файл, преобразованный в base64, и мне нужно было знать, насколько большим может быть файл, поэтому я использовал старый добрый брут принудительно тестировать все более крупные файлы, пока скрипт не сломается. - person SomethingDark; 04.10.2016
comment
@SomethingDark, я высоко ценю твой подход! Это единственный способ убедиться, как работает sth. Говоря сломанным, я также имел в виду, что вы не можете доверять такому инструменту - вы начинаете использовать его, но рано или поздно ограничение будет преследовать вас, и вы останетесь без альтернативы :( - person Andrzej Martyna; 04.10.2016
comment
Прохладный. Теперь я могу передавать самораспаковывающиеся .exe-файлы через буфер обмена через Citrix, хоть кусками по 70 Мегабайт ;) - person Stefan Steiger; 30.03.2017
comment
@RadagasttheBrown - Нет. Он обрабатывает только файлы. - person dbenham; 21.11.2018
comment
Есть ли способ сохранить полученный base64 в буфер обмена вместо создания файла? - person Archie G. Quiñones; 10.06.2019
comment
@ ArchieG.Quiñones - Нет, CERTUTIL не может работать напрямую со стандартным вводом или выводом, поэтому нет встроенного способа передать результат в CLIP. Но вы можете написать пакетный скрипт, который записывает во временный файл, TYPE временный файл и передает вывод в CLIP, а затем удаляет временный файл. - person dbenham; 10.06.2019

Вот пакетный файл с именем base64encode.bat, который кодирует base64.

@echo off
if not "%1" == "" goto :arg1exists
echo usage: base64encode input-file [output-file]
goto :eof
:arg1exists
set base64out=%2
if "%base64out%" == "" set base64out=con 
(
  set base64tmp=base64.tmp
  certutil -encode "%1" %base64tmp% > nul
  findstr /v /c:- %base64tmp%
  erase %base64tmp%
) > %base64out%
person BSalita    schedule 30.01.2017
comment
Этот скрипт будет работать лучше, если вы добавите setlocal enabledelayedexpansion и используете !base64tmp! внутри (...). В противном случае значение определяется при считывании последовательности (...), а не при ее выполнении. - person Jesse Chisholm; 18.11.2018
comment
гораздо более простое решение без необходимости иметь дело с заголовками: stackoverflow.com/a/60404255/12861751 - person HaxAddict1337; 11.04.2020