批量解码base64

95

我正在尝试使用批处理创建安装程序。当然,安装程序需要由将要安装的文件组成,所以我考虑使用base64对这些文件进行编码,然后简单地解码并将它们写入其目标位置。

如果Windows也像Linux系统一样包含 base64 工具,我的工作肯定很容易。然而,由于Windows中没有此工具,是否有任何方法可以完全使用批处理文件解码base64内容?我该如何实现呢?

任何帮助将不胜感激。

(这只是一个实验,所以我不用担心效率等问题。)


1
还有,请查看这个链接:http://f2ko.de/en/b64.php - David Refoua
这个评论是我最喜欢的答案,那个程序更像是一种Linux体验。 - neokyle
2个回答

183

实际上,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]

当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以来一直存在。 - David Ruhmann
38
我本来打算在搜索引擎中输入“在批处理中使用base64”的,我敢打赌这是我曾经搜索过的最令人绝望的事情之一。 - nik.shornikov
4
运行"certutil -encode inputFileName encodedOutputFileName"会生成一个以"-----BEGIN CERTIFICATE-----"和"-----END CERTIFICATE-----"括起来的Base64字符串,因此在生成之后不能直接解码该文件。 - David Morales
2
@DavidMorales - 不是这样的!你试过吗?即使有头部和尾部,-DECODE命令也能正常工作。我不确定具体规则是什么,但CERTUTIL -DECODE对编码源格式非常宽容。 - dbenham
4
@AndrzejMartyna - 并不是它坏了,而是有一个最大的输入文件大小限制为74472684字节。 - SomethingDark
显示剩余11条评论

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%

4
如果在(...)内添加setlocal enabledelayedexpansion并使用!base64tmp!,那么此脚本将更有效。否则,当读取(...)序列时确定其值,而不是在执行时确定其值。 - Jesse Chisholm
2
一个更简单的解决方案,无需处理头文件:https://dev59.com/NLnoa4cB1Zd3GeqPQnT_#60404255 - ScriptKidd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接