CMD 批处理 - 将文件编码为 base 64 和 trim 字符和换行符
CMD batch - encode file to base 64 and trim characters and new line
我正在尝试使用以下命令从 CMD 生成批处理文件:
- 将文件转换为 base 64 - 使用 certutil 命令这是 base 64 的内容的样子 (B64.txt):
- 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
我的问题是:
使用命令find /V*如何定义换行符并删除它们?
有没有更有效的方法?
这也可以在不将基数 64 分配为变量的情况下完成吗?原来变量的限制只有9000个字符左右,而我正常转换的base 64有70,000个字符。
- Edit:
您可以使用 bat/cmd file with a c# 代码。
然后您将编译它并在 运行 时 运行 它以在一行中获取所有字符串 ...
- 用法:
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);
}
}
}
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
我正在尝试使用以下命令从 CMD 生成批处理文件:
- 将文件转换为 base 64 - 使用 certutil 命令这是 base 64 的内容的样子 (B64.txt):
- 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
我的问题是:
使用命令find /V*如何定义换行符并删除它们?
有没有更有效的方法?
这也可以在不将基数 64 分配为变量的情况下完成吗?原来变量的限制只有9000个字符左右,而我正常转换的base 64有70,000个字符。
- Edit:
您可以使用 bat/cmd file with a c# 代码。
然后您将编译它并在 运行 时 运行 它以在一行中获取所有字符串 ...
- 用法:
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);
}
}
}
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.
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