Dekodowanie base64 wsadowo

83

Próbuję zrobić instalator przy użyciu wsadowego. Oczywiście instalator musi składać się z plików, które zostaną zainstalowane, więc myślę o zakodowaniu plików w base64, a następnie po prostu odkodowaniu i zapisaniu w miejscu docelowym.

Oczywiście moja praca byłaby bardzo łatwa, gdyby Windows miał coś w rodzaju base64narzędzia, które zawierają Linux-y. Ponieważ jednak go po prostu nie ma, czy istnieje sposób na całkowite zdekodowanie zawartości base64 za pomocą plików wsadowych? Jak miałbym to osiągnąć?

Każda pomoc jest mile widziana.

(To tylko eksperyment, więc nie martwię się o nieefektywność itp.)

user2064000
źródło
1
Zobacz także: f2ko.de/en/b64.php
David
Ten komentarz był moją ulubioną odpowiedzią, że program bardziej przypomina Linuksa.
neokyle

Odpowiedzi:

166

W rzeczywistości system Windows ma narzędzie, które koduje i dekoduje base64 - CERTUTIL

Nie jestem pewien, która wersja systemu Windows wprowadziła to polecenie.

Aby zakodować plik:

certutil -encode inputFileName encodedOutputFileName

Aby zdekodować plik:

certutil -decode encodedInputFileName decodedOutputFileName

Istnieje wiele dostępnych czasowników i opcji dostępnych dla CERTUTIL.

Aby uzyskać listę prawie wszystkich dostępnych czasowników:

certutil -?

Aby uzyskać pomoc dotyczącą konkretnego czasownika (na przykład -encode):

certutil -encode -?

Aby uzyskać pełną pomoc dotyczącą prawie wszystkich czasowników:

certutil -v -?

Co tajemnicze, -encodehexczasownik nie jest wymieniony z certutil -?lub certutil -v -?. Ale jest to opisane za pomocą certutil -encodehex -?. To kolejna przydatna funkcja :-)

Aktualizacja

Jeśli chodzi o komentarz Davida Moralesa, istnieje słabo udokumentowana opcja typu dla -encodehexczasownika, która pozwala na tworzenie ciągów base64 bez linii nagłówka lub stopki.

certutil [Options] -encodehex inFile outFile [type]

Typ 1 zwróci base64 bez linii nagłówka lub stopki.

Zobacz https://www.dostips.com/forum/viewtopic.php?f=3&t=8521#p56536, aby zapoznać się z krótką listą dostępnych formatów typów. Bardziej szczegółowe informacje na temat dostępnych formatów można znaleźć na stronie https://www.dostips.com/forum/viewtopic.php?f=3&t=8521#p57918 .

Nie zbadano, ale -decodehexczasownik ma również opcjonalny argument typu końcowego.

dbenham
źródło
8
Certutil istnieje od co najmniej Windows Server 2003 .
David Ruhmann
38
Dałbym
4
uruchomienie certutil -encode inputFileName encodedOutputFileNamegeneruje łańcuch base64 ujęty w „----- BEGIN CERTIFICATE -----” i „----- END CERTIFICATE -----”, więc nie można bezpośrednio zdekodować pliku po jego utworzeniu.
David Morales,
2
@DavidMorales - Nieprawda! Próbowałeś tego? Polecenie -DECODE działa dobrze z nagłówkiem i stopką na miejscu. Nie jestem pewien co do dokładnych reguł, ale CERTUTIL -DECODE wybacza bardzo dobrze format zakodowanego źródła.
dbenham
4
@AndrzejMartyna - nie chodzi o to, że jest zepsuty, ale maksymalny rozmiar pliku wejściowego to 74472684 bajtów.
SomethingDark
5

Oto plik wsadowy o nazwie base64encode.bat, który koduje 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
źródło
2
Ten skrypt będzie działał lepiej, jeśli dodasz setlocal enabledelayedexpansioni użyjesz !base64tmp!wewnątrz (...). W przeciwnym razie wartość jest określana podczas (...)wczytywania sekwencji, a nie podczas jej wykonywania.
Jesse Chisholm
1
znacznie prostsze rozwiązanie, bez konieczności zajmowania się nagłówkami: stackoverflow.com/a/60404255/12861751
HackingAddict1337