CMD 批处理 - 将文件编码为 base 64 和 trim 字符和换行符

CMD batch - encode file to base 64 and trim characters and new line

我正在尝试使用以下命令从 CMD 生成批处理文件:

  1. 将文件转换为 base 64 - 使用 certutil 命令这是 base 64 的内容的样子 (B64.txt):

  1. Trim base 64 - 基本上,我想删除 -----BEGIN CERTIFICATE------- ---证书结束-----这部分已经完成,唯一剩下的就是trim 换行符 制作 base64 的单行,因为我会将其传递给请求负载。

这是我目前所做的:

@ECHO OFF 
cd /filePath
certutil -encode sample.pdf B64.txt
type B64.txt | find /V "-----BEGIN CERTIFICATE-----" | find /V "-----END CERTIFICATE-----" > B64.txt

我的问题是:

  1. 使用命令find /V*如何定义换行符并删除它们?

  2. 有没有更有效的方法?

这也可以在不将基数 64 分配为变量的情况下完成吗?原来变量的限制只有9000个字符左右,而我正常转换的base 64有70,000个字符。

  • Edit:

您可以使用 / file with a 代码。

然后您将编译它并在 运行 时 运行 它以在一行中获取所有字符串 ...

  • 用法:

1) 编辑:cd /d "D:\Path\to\file\",添加 驱动器:\and\path\to\your\directory

2) 将下面的代码保存为文件 OneLine.cmd

/* 2>nul & @cls & @echo off & title <nul & title %~nx0 & setlocal enabledelayedexpansion

cd /d "D:\Path\to\file\" && set "_b64_file=%__CD__%\B64.txt"
"%__APPDIR__%certutil.exe" -encode -f ".\sample.pdf" "!_b64_file!" >nul 
for /f "tokens=*" %%c in ('%__APPDIR__%where.exe /r "c:\Windows\Microsoft.NET" csc.exe
')do >2nul >nul "%%~c" /t:exe /out:"%tmp%\OneLine.exe" "%~f0" /platform:anycpu /unsafe+ /w:0 /o /nologo && goto :next

:next 
"%tmp%\OneLine.exe" & 2>nul >nul del /q /f "%tmp%\OneLine.exe" & endlocal && goto :EOF || rem :: */

using System; using System.IO;using System.Text;namespace OneLineB64 {class Program {static void Main(string[] args){
String Path = System.Environment.GetEnvironmentVariable("_b64_file");String alllines = (File.ReadAllText(Path).Replace(Environment.NewLine, ""));
alllines = alllines.Remove(0,27); alllines = alllines.Remove((alllines.Length)-25);File.WriteAllText(Path, alllines);}}}
  • 常规中的相同代码formatting/layout
/* 2>nul & @cls

@echo off 

title <nul
title %~nx0

setlocal enabledelayedexpansion

cd /d "D:\Path\to\file\"
set "_b64_file=%__CD__%\B64.txt"

"%__APPDIR__%certutil.exe" -encode -f ".\sample.pdf" "!_b64_file!" >nul 

for /f "tokens=*" %%c in ('%__APPDIR__%where.exe /r "c:\Windows\Microsoft.NET" csc.exe')do (
   >2nul >nul "%%~c" /t:exe /out:"%tmp%\OneLine.exe" "%~f0" /platform:anycpu /unsafe+ /w:0 /o /nologo && goto :next
   )

:next 
"%tmp%\OneLine.exe"
2>nul >nul del /q /f "%tmp%\OneLine.exe" 

endlocal
goto :EOF

*/

using System;
using System.IO;
using System.Text;

namespace OneLineB64
{
    class Program
    {
        static void Main(string[] args)
        {
         String Path = System.Environment.GetEnvironmentVariable("_b64_file");
         String alllines = (File.ReadAllText(Path).Replace(Environment.NewLine, ""));
         alllines = alllines.Remove(0,27); 
         alllines = alllines.Remove((alllines.Length)-25);
         File.WriteAllText(Path, alllines);
        }
    }
}


File Class

SubString/Remove Characters in String

Get System Environment Variable string

Environment.GetEnvironmentVariable Method


  • /end Edit:

Understanding the maximum character limit in the variable length, it is not possible to do it beyond 8191 digits/characters


对于删除行,您只能使用证书,因为这个词出现在第一行和最后一行。

certutil + -f 如果存在则覆盖文件

type B64.txt^|"%__APPDIR__%find.exe" /v "CERTIFICATE" 将忽略第一行和最后一行

set "_b64=!_b64!%%~b" 将在同一 variable/1 行

中逐行保存

>B64.txt echo/!_b64! 将 replace/overwrite 文件的内容与保存在变量中的值(b64 字符串在一行)

@echo off && setlocal enabledelayedexpansion

cd /d "d:\filePath" && set "_b64="<nul

"%__APPDIR__%certutil.exe" -encode -f sample.pdf B64.txt >nul && for /f %%b in (
'type B64.txt^|"%__APPDIR__%find.exe" /v "CERTIFICATE"')do set "_b64=!_b64!%%~b"

>B64.txt set/p "'=!_b64: =!"<nul & endlocal && exit /b 

常规布局中的相同代码:

@echo off

setlocal enabledelayedexpansion

cd /d "d:\filePath"
set "_b64="<nul

"%__APPDIR__%certutil.exe" -encode -f sample.pdf B64.txt >nul

for /f %%b in ('type B64.txt^|"%__APPDIR__%find.exe" /v "CERTIFICATE"')do set "_b64=!_b64!%%~b"

>B64.txt set/p "'=!_b64: =!"<nul 

endlocal
goto :EOF

这可能会如你所愿。如果您使用的是受支持的 Windows 系统,则可以使用 PowerShell。

SET "FILENAME=C:\src\t\sample.pdf"
SET "OUTFILENAME=C:\src\t\B64.txt"

powershell -NoLogo -NoProfile -Command ^
    "[Convert]::ToBase64String([IO.File]::ReadAllBytes('%FILENAME%')) |" ^
        "Out-File -FilePath '%OUTFILENAME%' -Encoding ascii -NoNewline"

有一个使用 CERTUTIL 未记录的功能的非常简单的解决方案。您可以使用
-ENCODEHEX 末尾带有未记录格式的动词,无需任何 headers.

即可直接在一行中直接获得所需的 base 64 输出
certutil -encodehex -f sample.pdf B64.txt 0x40000001

有关所有格式选项的详细说明,请参阅 DosTips More Tricks with certutil thread for more information. Especially look at this 4th post

能否将link发送到B64.txt或filePath的内容或在此处粘贴文本?我的 OCR 无法获得 100% 的转换,甚至 Google Lens 也不能。

我的理解是你需要一行 base 64 代码而不需要 headers,对吗?

Certutil 可以处理 70k 个字符。 set /p 避免换行。
没有证书的 base64 的一行输出 headers 示例:

certutil -f -encodehex "Fujitsu Air Con Manual.pdf" test.b64 1
for /f %i in (test.b64) do set /p=%i<nul

输出可能会被重定向到文件或通过管道“将其传递给请求负载”

在 Win 10 上测试:@ 250 万个字符。

dir test.b64
 Volume in drive C is Local Disk
 Volume Serial Number is 74F6-ACFC

 Directory of C:\Users\Al\Desktop

05/05/2022  12:12         **2,677,662** test.b64
               1 File(s)      2,677,662 bytes
               0 Dir(s)  54,901,383,168 bytes free

for /f %i in (test.b64) do set /p=%i<nul>> one.line
dir one.line
 Volume in drive C is Local Disk
 Volume Serial Number is 74F6-ACFC

 Directory of C:\Users\Al\Desktop

05/05/2022  13:00         **2,596,560** one.line
               1 File(s)      2,596,560 bytes
               0 Dir(s)  54,812,700,672 bytes free