base64をバッチでデコードする


83

バッチを使用してインストーラーを作成しようとしています。もちろん、インストーラーはインストールされるファイルで構成されている必要があるので、base64でファイルをエンコードし、単にデコードして宛先に書き込むことを考えています。

もちろん、base64Linuxボックスに含まれているツールのようなものがWindowsにあれば、私の作業は非常に簡単です。しかし、それは単にそこにないので、バッチファイルを使用してbase64コンテンツを完全にデコードする方法はありますか?そして、私はこれをどのように達成しますか?

どんな助けでも大歓迎です。

(単なる実験なので、非効率などは気になりません。)


1
また、これをチェックしてください:f2ko.de/en/b64.php
David Refoua

このコメントは私のお気に入りの答えでした。そのプログラムはLinuxの経験に非常に似ています。
ネオカイル2018

回答:


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 -?ます。これも便利な機能です:-)

更新

David Moralesのコメントに関しては、動詞のタイプオプション十分に文書化されいないため、-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 = 8521p57918を参照してください

調査されていませんが、-decodehex動詞にはオプションの末尾の型引数もあります。


8
Certutilは、少なくともWindows Server2003から存在しています
David Ruhmann 2013年

37

4
runningcertutil -encode inputFileName encodedOutputFileNameは、「----- BEGINCERTIFICATE -----」と「----- ENDCERTIFICATE -----」で囲まれたbase64文字列を生成するため、ファイルの生成後にファイルを直接デコードすることはできません。
デビッド・モラレス

2
@ DavidMorales-真実ではありません!やってみましたか?-DECODEコマンドは、ヘッダーとフッターが適切に配置されていれば問題なく機能します。正確なルールについてはわかりませんが、CERTUTIL -DECODEは、エンコードされたソースの形式について非常に寛容です。
dbenham 2016年

4
@ AndrzejMartyna-壊れているわけではありませんが、入力ファイルの最大サイズは74472684バイトです。
SomethingDark

5

これは、base64をエンコードするbase64encode.batというバッチファイルです。

@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!(...)(...)
ジェシーチザム

1
ヘッダに対処することなく、はるかに簡単な解決策、:stackoverflow.com/a/60404255/12861751
HackingAddict1337
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.