CMD batch - кодирует файл в base 64 и обрезает символы и новую строку - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь создать командный файл из CMD с помощью следующих команд:

  1. Конвертировать файл в базу 64 - с помощью команды certutil так выглядит содержимое базы 64 (B64 .txt):

converted B64.txt

Обрезать базу 64 - в основном, я хочу удалить ----- НАЧАТЬ СЕРТИФИКАТ ----- и ----- КОНЕЦ СЕРТИФИКАТА ----- эта часть выполнена , осталось только обрезать символы новой строки , чтобы получить один слой 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. Есть ли более эффективный способ сделать это?

Можно ли это сделать без назначения base 64 в качестве переменной? Оказывается, предел для переменных составляет всего около 9000 символов, а базовая 64-я, которую я конвертирую, обычно имеет 70000 символов.

Ответы [ 3 ]

5 голосов
/ 26 февраля 2020

Существует очень простое решение, использующее недокументированные функции CERTUTIL. Вы можете использовать глагол
-ENCODEHEX с недокументированным форматом в конце, чтобы напрямую получить желаемый вывод base 64 на одной строке без заголовков.

certutil -encodehex -f sample.pdf B64.txt 0x40000001

См. DosTips Дополнительные трюки с certutil нитью для получения дополнительной информации. Особенно посмотрите на этот 4-й пост для подробного объяснения всех параметров формата.

2 голосов
/ 25 февраля 2020
  • Редактировать:

Вы можете использовать / файл с кодом.

Затем вы скомпилируете его и запустите во время выполнения, чтобы получить все строки в одной строке. ..

  • Использование:

1) Редактирование: cd /d "D:\Path\to\file\", добавление диска : \ и \ путь \ к \ вашему \ каталогу

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);}}}
  • Тот же код в обычном форматировании / макете
/* 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 / Удалить символы в строке

Получить строку переменной среды системы

Окружение. Метод GetEnvironmentVariable


  • / end Редактировать:

Понимание максимального ограничения символов в переменной л кроме того, это невозможно сделать за пределами 8191 цифр / символов


Для удаления строк вы можете использовать только сертификат, потому что это слово присутствует в 1-й и последней строке.

certutil + -f для файла перезаписи, если он существует

type B64.txt^|"%__APPDIR__%find.exe" /v "CERTIFICATE" будет игнорироваться 1-я и последняя строка

set "_b64=!_b64!%%~b" будет сохранять строку за строкой в ​​одной и той же переменной / 1 строка

>B64.txt echo/!_b64! заменяет / перезаписать содержимое файла значением, сохраненным в переменной (строки 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

0 голосов
/ 25 февраля 2020

Это может делать то, что вы хотите. Если вы используете поддерживаемую 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"
...