2016-05-05 132 views
4

我已經找到了許多方法來base64使用Windows上的命令行編碼整個文件,但我似乎無法找到一種簡單的方法來使用命令行實用程序批量編碼只是一個「字符串」。Base64編碼「字符串」 - 命令行Windows?

如何做到這一點,例如在批處理文件中使用?

+0

如何使用'>「%TEMP%\ EncodeBase64.tmp」echo string'將字符串寫入臨時文件,然後使用實用程序對臨時文件「%TEMP%\ EncodeBase64.tmp」進行編碼,然後讀取(「%TEMP%\ EncodeBase64.tmp」)中設置「StringVariable = %% I」,最後使用del命令刪除臨時文件。 %TEMP%\ EncodeBase64.tmp「'? – Mofi

+2

有沒有聽說過'CertUtil.exe',Windows的本地工具與許多有用的動詞?例如,'CertUtil -encode'和'CertUtil -decode'將文件編碼/解碼到/從Base64解碼; (也有幫助:'CertUtil -hashfile [{SHA1 | MD5}]'計算一個文件的散列值...) - 用一個臨時文件,你也可以處理字符串... – aschipfl

+1

其中一個你們都需要發佈'certutil'解決方案作爲答案。 – rojo

回答

8

這裏是你可以從一個cmd控制檯運行PowerShell的一班輪那會Base64編碼一種條形碼G。

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

它可能沒有npocmaka的解決方案一樣快,但你可以set a console macro with it

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> 
+0

太棒了!使用htmlfiile對象比mshta更好... – npocmaka

+0

@rojo尼斯腳本,我喜歡它!我想知道在VBScript中是否有相當於你的代碼? – Hackoo

+1

@Hackoo請參閱編輯。 – rojo

5

This script可以解碼/編碼的base64串從XP每臺機器上和上面而不需要安裝.NET或Internet Explorer 10/11.It甚至可以處理特殊的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> 
+1

在IE 10中引入了'window.btoa'和'window.atob'方法。如果用'ie = 10'替換'ie = edge',那麼您的腳本將與早期版本的Windows兼容。 – rojo

+0

@rojo - 好筆記! – npocmaka

1

雅高對問題的評論,你可以使用certutil。例如,

certutil -encode raw.txt encoded.txt 

certutil -f -encode raw.txt encoded.txt 

-f指 「力重寫」。否則,如果輸出文件(上面的encoded.txt)已經存在,你會得到一個錯誤。

但是,這會將輸出格式化爲encoded.txt文件,就好像它是證書PEM文件一樣,用BEGIN和END行完成,並在字符max處分割行。因此,您需要在批處理場景中進行進一步處理,並且如果字符串很長,則需要額外的工作。

+0

沒有額外的腳本。美麗在簡單! – msciwoj