Декодування base64 в пакетному режимі


83

Я намагаюся зробити інсталятор за допомогою пакетної програми. Звичайно, інсталятор повинен складатися з файлів, які будуть встановлені, тому я думаю кодувати файли в base64, просто декодувати їх і записати за призначенням.

Звичайно, моя робота була б дуже легкою, якби Windows мала щось на зразок base64інструменту, який містять ящики Linux. Однак, оскільки його просто немає, чи існує спосіб декодування вмісту base64 повністю за допомогою командних файлів? І як би я це зробив?

Будь-яка допомога вдячна.

(Це просто експеримент, тому мене не турбує неефективність тощо).


1
Також перевірте це: f2ko.de/en/b64.php
Девід Рефуа

Цей коментар був моєю улюбленою відповіддю: ця програма набагато більше схожа на досвід Linux.
неокліл

Відповіді:


165

Насправді 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дієслово також має необов’язковий аргумент типу завершення.


8
Certutil існує принаймні з Windows Server 2003 .
Девід Руман

37
Я б дав кілька хороших шансів, що "base64 in batch" - це найвідчайдушніше, що я коли-небудь вводив у пошуковій системі
nik.shornikov

4
запущений certutil -encode inputFileName encodedOutputFileNameгенерує рядок base64, укладений символами "----- НАЧАТИ СЕРТИФІКАТ -----" та "----- ЗАВЕРШИТИ СЕРТИФІКАТ -----", тому ви не зможете безпосередньо декодувати файл після його створення.
Девід Моралес,

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%

2
Цей сценарій буде працювати краще, якщо ви додасте setlocal enabledelayedexpansionта використаєте !base64tmp!всередині (...). В іншому випадку значення визначається, коли (...)послідовність читається, а не коли вона виконується.
Jesse Chisholm

1
набагато більш просте рішення, без необхідності мати справу з заголовками: stackoverflow.com/a/60404255/12861751
HackingAddict1337
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.