2016-05-05 11 views
4

Ich habe zahlreiche Möglichkeiten gefunden, um ganze Dateien unter Verwendung der Befehlszeile unter Windows Base64 zu codieren, aber ich finde nicht, eine einfache Möglichkeit zu finden, nur eine "Zeichenfolge" mithilfe eines Befehlszeilendienstprogramms im Batch zu codieren.Base64 "Zeichenfolge" codieren - Kommandozeile Windows?

Wie macht man das, zum Beispiel in einer Batch-Datei?

+0

Was ist mit dem Schreiben der Zeichenfolge in eine temporäre Datei mit '>"% TEMP% \ EncodeBase64.tmp "Echo-String', als nächstes kodieren Sie die temporäre Datei '"% TEMP% \ EncodeBase64.tmp "' mit einem Dienstprogramm, dann lesen die codierte Zeichenfolge aus Datei mit 'for/F" usebackq delims = "%% Ich in ("% TEMP% \ EncodeBase64.tmp ") setze" StringVariable = %% I "' und lösche schließlich die temporäre Datei mit 'del" % TEMP% \ EncodeBase64.tmp "'? – Mofi

+2

Hast du jemals von 'CertUtil.exe' gehört, einem nativen Tool von Windows mit vielen nützlichen Verben?zum Beispiel, 'CertUtil -encode' und' CertUtil-decode' kodieren/dekodieren eine Datei zu/von Base64; (auch hilfreich: 'CertUtil -hashfile [{SHA1 | MD5}]' berechnet einen Hash-Wert über eine Datei ...) - mit einer temporären Datei können Sie auch Strings bearbeiten ... – aschipfl

+1

Einer von euch muss schreiben die "Certutil" -Lösung als Antwort. – rojo

Antwort

8

Hier ist ein Powershell Einzeiler Sie von einer cmd-Konsole ausführen können thatll Base64 codiert einen String G.

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

Es ist wahrscheinlich nicht so schnell wie Lösung des npocmaka, aber man kann 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 

Beachten Sie, dass doskey nicht in Batch-Skripten funktioniert - nur die Konsole. Wenn Sie dies in einem Batch-Skript verwenden möchten, nehmen Sie eine Funktion vor.

@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 

Oder wenn Sie würde eine Charge + JScript Hybrid bevorzugen:

@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))); 

Edit: Batch + VBScript-Hybrid für @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

toll! Mit htmlfiile Objekt ist besser als mshta ... – npocmaka

+0

@rojo Nice Script und ich mag es! Ich frage mich, ob es in Vbscript ein Äquivalent Ihres Codes gibt? – Hackoo

+1

@Hackoo Siehe Bearbeiten. – rojo

5

This script kann dekodieren/kodieren base64-Strings auf jeder Maschine von XP und oben ohne 10 .net oder Internet Explorer erfordert installiert/11.It sogar spezielle Javascript entkam Symbole verarbeiten kann:

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

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

Dieser ist ein akzeptiert einziges Argument - die Zeichenfolge, die Sie kodieren möchten 64 zu stützen und druckt das Ergebnis (erfordert aber mindestens Internet Explorer 10 installiert ist):

@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

Die Methoden 'window.btoa' und' window.atob' wurden in IE 10 eingeführt. Ihr Skript wäre mit früheren Versionen von Windows kompatibel, wenn Sie 'ie = edge' durch' ie = 10' ersetzen. – rojo

+0

@rojo - gute Nachricht! – npocmaka

1

Accor Zu den Kommentaren zu der Frage können Sie certutil verwenden. z.B.

certutil -encode raw.txt encoded.txt 

oder

certutil -f -encode raw.txt encoded.txt 

The -f bedeutet "Kraft überschreiben". Andernfalls erhalten Sie einen Fehler, wenn die Ausgabedatei (encoded.txt oben) bereits existiert.

Dies formatiert jedoch die Ausgabe in die encoded.txt-Datei, als ob es eine Zertifikat-PEM-Datei wäre, komplett mit BEGIN- und END-Zeilen, und geteilte Zeilen am Zeichen max. Sie müssten also in einem Batch-Szenario weiterverarbeiten und bei langen Strings ein wenig zusätzliche Arbeit erledigen.

+0

kein zusätzliches Scripting. Schönheit in Einfachheit! – msciwoj

Verwandte Themen