我已经find了许多方法来使用Windows上的命令行base64编码整个文件,但我似乎无法find一个简单的方法来使用命令行工具批量编码一个“string”。
如何做到这一点,例如在batch file中使用?
这里是一个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 (@CodeSection==@Batch) @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)));
编辑: @Hackoo批处理+ VBScript混合:
<!-- : 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>
这个脚本可以解码/编码从XP和以上的每台机器上的base64字符串,而不需要安装.net或Internet Explorer 10 / 11.它甚至可以处理特殊的JavaScript转义符号:
// result is IkhlbGxvIg== base64.bat -encode "\u0022Hello\u0022" -eval yes // result is SGVsbG8= base64.bat -encode "Hello"
这个接受一个参数 – 你想要编码到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>
根据对这个问题的意见,你可以使用certutil 。 例如,
certutil -encode raw.txt encoded.txt
要么
certutil -f -encode raw.txt encoded.txt
-f
表示“强制覆盖”。 否则,如果上面的输出文件(encoded.txt)已经存在,你会得到一个错误。
但是,这将把输出格式化为encoded.txt文件,就好像它是一个证书PEM文件一样,用BEGIN和END行结束,在最大字符处分割行。 所以你需要在批处理场景中进行进一步的处理,如果字符串很长,还需要额外的工作。