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

83

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

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

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

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

user2064000
источник
1
Также проверьте это: f2ko.de/en/b64.php
Дэвид Рефуа,
Этот комментарий был моим любимым ответом, эта программа больше похожа на Linux.
neokyle

Ответы:

166

На самом деле в 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 -?. Еще одна удобная функция :-)

Обновить

Что касается комментария Дэвида Моралеса, существует плохо документированная опция типа для -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глагола также есть необязательный аргумент конечного типа.

Dbenham
источник
8
Certutil существует как минимум с Windows Server 2003 .
Дэвид Рухманн,
38
Я бы дал неплохие шансы на то, что «base64 in batch» было самым отчаянным, что я когда-либо
вводил
4
running certutil -encode inputFileName encodedOutputFileNameгенерирует строку base64, заключенную в "----- BEGIN CERTIFICATE -----" и "----- END CERTIFICATE -----", поэтому вы не можете напрямую декодировать файл после его создания.
Дэвид Моралес
2
@DavidMorales - Неправда! Вы пробовали? Команда -DECODE отлично работает с верхним и нижним колонтитулами. Я не уверен в точных правилах, но CERTUTIL -DECODE очень снисходительно относится к формату закодированного источника.
dbenham
4
@AndrzejMartyna - дело не в том, что он битый, но максимальный размер входного файла составляет 74472684 байта.
SomethingDark
5

Вот командный файл 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%
BSalita
источник
2
Этот сценарий будет работать лучше, если вы добавите setlocal enabledelayedexpansionи используете !base64tmp!внутри (...). В противном случае значение определяется при (...)считывании последовательности, а не при ее выполнении.
Джесси Чизхолм
1
гораздо более простое решение, без необходимости иметь дело с заголовками: stackoverflow.com/a/60404255/12861751
HackingAddict1337