Decodieren von base64 im Batch

83

Ich versuche, ein Installationsprogramm mit Batch zu erstellen. Natürlich muss ein Installationsprogramm aus Dateien bestehen, die installiert werden. Daher denke ich darüber nach, die Dateien in base64 zu codieren, sie einfach zu decodieren und an ihr Ziel zu schreiben.

Natürlich wäre meine Arbeit sehr einfach, wenn Windows so etwas wie das base64Tool hätte, das Linux-Boxen enthalten. Gibt es jedoch eine Möglichkeit, Base64-Inhalte mithilfe von Batch-Dateien vollständig zu dekodieren, da sie einfach nicht vorhanden sind ? Und wie würde ich das erreichen?

Jede Hilfe wird geschätzt.

(Es ist nur ein Experiment, also mache ich mir keine Sorgen um Ineffizienz und ähnliches.)

user2064000
quelle
1
Überprüfen Sie auch heraus: f2ko.de/de/b64.php
David Refoua
Dieser Kommentar war meine Lieblingsantwort, dieses Programm ähnelt viel eher einer Linux-Erfahrung.
Neokyle

Antworten:

165

Tatsächlich hat Windows ein Dienstprogramm, das base64 - CERTUTIL codiert und decodiert

Ich bin nicht sicher, welche Windows-Version diesen Befehl eingeführt hat.

So codieren Sie eine Datei:

certutil -encode inputFileName encodedOutputFileName

So dekodieren Sie eine Datei:

certutil -decode encodedInputFileName decodedOutputFileName

CERTUTIL stehen eine Reihe verfügbarer Verben und Optionen zur Verfügung.

So erhalten Sie eine Liste fast aller verfügbaren Verben:

certutil -?

So erhalten Sie Hilfe zu einem bestimmten Verb (z. B. -encode):

certutil -encode -?

Um vollständige Hilfe für fast alle Verben zu erhalten:

certutil -v -?

Auf mysteriöse Weise ist das -encodehexVerb nicht mit certutil -?oder aufgeführt certutil -v -?. Aber es wird mit beschrieben certutil -encodehex -?. Es ist eine weitere praktische Funktion :-)

Aktualisieren

In Bezug auf den Kommentar von David Morales gibt es eine schlecht dokumentierte Typoption für das -encodehexVerb, mit der base64-Zeichenfolgen ohne Kopf- oder Fußzeilen erstellt werden können.

certutil [Options] -encodehex inFile outFile [type]

Ein Typ von 1 ergibt base64 ohne die Kopf- oder Fußzeilen.

Unter https://www.dostips.com/forum/viewtopic.php?f=3&t=8521#p56536 finden Sie eine kurze Liste der verfügbaren Typformate. Weitere Informationen zu den verfügbaren Formaten finden Sie unter https://www.dostips.com/forum/viewtopic.php?f=3&t=8521#p57918 .

Nicht untersucht, aber das -decodehexVerb hat auch ein optionales nachfolgendes Typargument.

Dbenham
quelle
8
Certutil gibt es seit mindestens Windows Server 2003 .
David Ruhmann
37
Ich hätte einige gute Chancen gegeben, dass "base64 in batch" das verzweifeltste war, was ich jemals in eine Suchmaschine
eingegeben habe
4
Beim Ausführen certutil -encode inputFileName encodedOutputFileNamewird eine base64-Zeichenfolge generiert, die von "----- BEGIN CERTIFICATE -----" und "----- END CERTIFICATE -----" eingeschlossen wird, sodass Sie die Datei nach ihrer Erstellung nicht direkt dekodieren können.
David Morales
2
@ DavidMorales - Nicht wahr! Hast Du es versucht? Der Befehl -DECODE funktioniert einwandfrei, wenn Kopf- und Fußzeile vorhanden sind. Ich bin mir über die genauen Regeln nicht sicher, aber CERTUTIL -DECODE verzeiht das Format der codierten Quelle sehr.
Dbenham
4
@AndrzejMartyna - es ist nicht so, dass es kaputt ist, aber es gibt eine maximale Größe der Eingabedatei von 74472684 Bytes.
SomethingDark
5

Hier ist eine Batch-Datei namens base64encode.bat, die base64 codiert.

@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
quelle
2
Dieses Skript wird besser funktionieren , wenn Sie hinzufügen , setlocal enabledelayedexpansionund die Verwendung !base64tmp!innerhalb der (...). Andernfalls wird der Wert beim (...)Einlesen der Sequenz bestimmt , nicht beim Ausführen.
Jesse Chisholm
1
Eine viel einfachere Lösung, ohne sich mit den Headern befassen zu müssen: stackoverflow.com/a/60404255/12861751
HackingAddict1337