Base64 Encode "string" - командной строки Windows?

Я нашел множество способов для base64 кодировать целые файлы с помощью командной строки в Windows, но я не могу найти простой способ пакетного кодирования только "строки" с помощью утилиты командной строки.

Как это сделать, например, для использования в пакетном файле?

Ответ 1

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

powershell "[convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(\"Hello world!\"))"

Возможно, это не так быстро, как решение npocmaka, но вы можете установить консольный макрос с ним.

doskey btoa=powershell "[convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(\"$*\"))"
doskey atob=powershell "[Text.Encoding]::UTF8.GetString([convert]::FromBase64String(\"$*\"))"

btoa Hello world!
btoa This is fun.
btoa wheeeeee!
atob SGVsbG8gd29ybGQh

Имейте в виду, что doskey не работает в пакетных сценариях - только консоль. Если вы хотите использовать это в пакетном скрипте, создайте функцию.

@echo off
setlocal

call :btoa b64[0] "Hello world!"
call :btoa b64[1] "This is fun."
call :btoa b64[2] "wheeeeee!"
call :atob b64[3] SGVsbG8gd29ybGQh

set b64
goto :EOF

:btoa <var_to_set> <str>
for /f "delims=" %%I in (
    'powershell "[convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(\"%~2\"))"'
) do set "%~1=%%I"
goto :EOF

:atob <var_to_set> <str>
for /f "delims=" %%I in (
    'powershell "[Text.Encoding]::UTF8.GetString([convert]::FromBase64String(\"%~2\"))"'
) do set "%~1=%%I"
goto :EOF

Или, если вы предпочитаете пакетный + гибридный JScript:

@if (@[email protected]) @then
@echo off & setlocal

call :btoa b64[0] "Hello world!"
call :btoa b64[1] "This is fun."
call :btoa b64[2] "wheeeeee!"
call :atob b64[3] SGVsbG8gd29ybGQh

set b64
goto :EOF

:btoa <var_to_set> <str>
:atob <var_to_set> <str>
for /f "delims=" %%I in ('cscript /nologo /e:JScript "%~f0" %0 "%~2"') do set "%~1=%%I"
goto :EOF

@end // end batch / begin JScript hybrid code
var htmlfile = WSH.CreateObject('htmlfile');
htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=10" />');
WSH.Echo(htmlfile.parentWindow[WSH.Arguments(0).substr(1)](WSH.Arguments(1)));

Изменение: пакет + гибридный VBScript для @Hackoo:

<!-- : batch portion
@echo off & setlocal

call :btoa b64[0] "Hello world!"
call :btoa b64[1] "This is fun."
call :btoa b64[2] "wheeeeee!"
call :atob b64[3] SGVsbG8gd29ybGQh

set b64
goto :EOF

:btoa <var_to_set> <str>
:atob <var_to_set> <str>
for /f "delims=" %%I in ('cscript /nologo "%~f0?.wsf" %0 "%~2"') do set "%~1=%%I"
goto :EOF

: VBScript -->
<job>
    <script language="VBScript">
        Set htmlfile = WSH.CreateObject("htmlfile")
        htmlfile.write("<meta http-equiv='x-ua-compatible' content='IE=10' />")
        if WSH.Arguments(0) = ":btoa" then
            WScript.Echo htmlfile.parentWindow.btoa(WSH.Arguments(1))
        else
            WScript.Echo htmlfile.parentWindow.atob(WSH.Arguments(1))
        end if
    </script>
</job>

Ответ 2

Согласно комментариям на вопрос, вы можете использовать certutil. например,

certutil -encode raw.txt encoded.txt

или

certutil -f -encode raw.txt encoded.txt

-f означает "принудительная перезапись". В противном случае вы получите ошибку, если выходной файл (codeded.txt выше) уже существует.

Однако это отформатирует вывод в файл encoded.txt, как если бы это был PEM файл сертификата, со строками BEGIN и END и разделенными строками в символе max. Таким образом, вам потребуется выполнить дополнительную обработку в пакетном сценарии и немного дополнительной работы, если строки вообще длинные.

Ответ 3

Этот скрипт может декодировать/кодировать строки base64 на каждом компьютере с XP и выше, не требуя установленного .net или интернет-обозревателя 10/11. Он даже может обрабатывать специальные экранированные символы JavaScript:

// result is IkhlbGxvIg==
base64.bat -encode "\u0022Hello\u0022" -eval yes

// result is SGVsbG8=
base64.bat -encode "Hello"

Этот принимает один аргумент - строку, которую вы хотите закодировать в base 64, и печатает результат (но требует установлен хотя бы Internet Explorer 10):

@echo off

setlocal

set "string=%~1"

::echo %string%^|mshta.exe "%~f0"
for /f "delims=" %%# in ('echo %string%^|mshta.exe "%~f0"') do (
    set b64=%%#
)

set b64

endlocal&exit /b %errorlevel%

<HTA:Application
   ShowInTaskbar = no
   WindowsState=Minimize
   SysMenu=No
   ShowInTaskbar=No
   Caption=No
   Border=Thin
>
<meta http-equiv="x-ua-compatible" content="ie=10" />
<script language="javascript" type="text/javascript">
    window.visible=false;
    window.resizeTo(1,1);

   var fso= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1);
   var fso2= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(0);
   var string=fso2.ReadLine();

    var encodedString = btoa(string);

   fso.Write(encodedString);
   window.close();
</script>

Ответ 4

Если у вас установлен OpenSSL для Windows, вы можете использовать его для кодирования строки "Hello":

echo | set /p="Hello" | openssl base64

| set /p= должен подавлять символ новой строки, который обычно выводит эхо.

Это даст тот же результат, что и в bash:

echo -n 'Hello' | openssl base64

Выход:

SGVsbG8=