使用Windows命令行将特定文件编码为Base64

4
我需要在Windows操作系统上使用命令行,在屏幕上生成特定文件的base64数据(不生成文件)。
我已经看到在Unix系统上只需要使用
cat <file_name>| base64

获取以base64编码的文件内容。

在Windows上我无法获得相同的结果。

我找到了这个解决方案:

certutil -encode -f <file_name> tmp.b64 && findstr /v /c:- tmp.b64 && del tmp.b64

但是这需要系统生成一个临时文件,因此最后需要将其销毁。 仅使用certutil命令,在屏幕上的结果会被3行包含无关信息的内容所污染。
有人能帮我提供一个在Windows上只产生base64数据的命令吗?
更新: 我通过这个新版本的命令改善了屏幕上的结果:
certutil -encode -f <file_name> tmp.b64 && cls && findstr /v /c:- tmp.b64 && del tmp.b64

结果更符合我的要求,但我希望避免每次创建临时文件tmp.b64
2个回答

4
通常在Windows上生成Base64字符串的方法是:
创建任意文件(可以是简单文本,也可以是PDF、docX等格式)。
echo Hello World!>input.ext

将其转换为Base64
certutil -encodehex -f "input.ext" "output.txt" 0x40000001 1>nul

要查看结果,请使用
type output.txt
SGVsbG8gV29ybGQhDQo=

要将输出发送到另一个命令,请使用管道将TYPE output.txt作为输入。然而,像许多转换任务一样,它需要进行文件IO操作。为了避免任何硬盘文件的痕迹,需要使用内存文件系统。
要循环遍历文件夹,请使用带有适当变量的for循环。
要解码output.txt。
certutil -decode -f output.txt output.ext 1>nul

type output.ext

Hello World!

答案

有一个非常小的(7.7 kB)可下载的exe c 2015可以用来对文件或控制台进行编码/解码,就像这样

b64 -e input.ext

屏幕上的结果或在管道中使用

SGVsbG8gV29ybGQhDQo=

请注意,这与上述内容完全相同,但关于为什么它可能不总是按预期工作的最新查询尚未更新,但这是一种出站使用方式。
开放问题的示例。
echo Hello World!|b64 -e

与上述结果相比并不准确,但是可以接受的吞吐量。

所以在使用时

echo SGVsbG8gV29ybGQhCg==|b64 -d

它确实报告正确。
Hello World!

区别的原因是结尾的EOL(换行符)
0000000C: 0A 0D
根据情况,可能有或没有实质性差异。还请注意命令行的工作长度受限,因此对字符串处理的控制台使用也受到限制。

我在服务器上没有openssl,但是当我使用以下解决方案时有效: certutil -encode <in-filename> <out-filename> - Darren Griffith

2
我建议在您的Windows机器上安装OpenSSL。设置PATH变量后,操作很简单:
type <file_name> | openssl base64

抱歉,我没有在服务器上安装其他应用程序的可能性。 - Vincenzo
无论出于何种原因,将其更改为“类型”。 - O.M.N.L
这可能有点边缘化,但谁知道Windows这种可怜的东西是否需要它呢。通常的建议是,如果命令不仅仅接受文件名参数,就使用重定向。 - tripleee
但是通过使用"更多"或"类型",我可以在文件上查看内容。 我的想法是不创建临时文件,而是将特定文件的base64结果作为命令的输出。 - Vincenzo

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