WindowsやMacで文字列を1行のbase64に変換するサンプルスクリプトです。
@DamashiGami様、@norisio様にいただいたコメントを反映しました。ご指摘ありがとうございます。
Windows
標準で提供されているcertutilを使用します。
certutilでbase64に変換するには入出力がファイルでなければならないので、少し使いづらいです。
そこで、以下のbatchスクリプトを作成しました。
REM 使用時は「-- [数字]」部分を削除してください。
@echo off
setlocal enabledelayedexpansion
set /p<NUL="%~1" > "%~dp0.tmp" -- [1]
certutil -encode "%~dp0.tmp" "%~dp0.out" >NUL -- [2]
for /f %%i in ('findstr /b /c:"-" /v "%~dp0.out"') do set /p<NUL="%%i" -- [3]
echo; -- [4]
del "%~dp0.tmp" "%~dp0.out" -- [5]
使い方
base64.bat 文字列
動作説明
[1] set /p<NUL="%~1" > "%~dp0.tmp"
%~1
が第一引数です。
これをset /p<NUL=
に与えることで、改行文字を含まない文字列を標準出力に出力できます。
※ 改行文字を含めてしまうと、base64に変換したときに、改行文字まで含めた値が変換されてしまいます。
%~dp0
にはbase64.bat
が存在するディレクトリのパスが格納されています。
.tmp
は一時ファイルのファイル名です。
これらを組み合わせて、改行を含まない文字列を.tmp
ファイルに出力しています。
[2] certutil -encode "%~dp0.tmp" "%~dp0.out" >NUL
「certutil -encode 入力ファイル 出力ファイル
」で入力ファイル内の文字列をbase64に変換した結果を出力ファイルに書き出します。「>NUL
」で標準出力がターミナル上に表示されるのを抑制します。
[3] for /f %%i in ('findstr /b /c:"-" /v "%~dp0.out"') do set /p<NUL="%%i"
ここは少し複雑なので、分割して説明します。
for /f %%i in ('command1') do command2部分:
command1
部分に指定したコマンドの実行結果に応じて1行ごとにcommand2
を実行します。引数で与えられた文字列が長い場合、certutilの出力結果が複数行に分かれてしまうため、ここで連結するためにforコマンドを利用します。
findstr /b /c:"-" /v "%~dp0.out"部分:
[2]で作成した一時ファイル「%~dp0.out」にはcertutilが出力した余分な行が含まれています。それらを除外してbase64の行だけをcommand2に渡すために、findstrコマンドを利用します。
まず、findstrコマンドに/b /c:"-"
オプションを指定します。これにより、先頭がハイフンで始まる行にマッチします。
また、/v
を指定することで、マッチした行以外にマッチします。これらのオプションを組み合わせることで、%~dp0.out
ファイルの中身のうち、先頭がハイフンで始まる行以外を出力します。
set /p<NUL="%%i"部分:
base64に変換した結果を出力しています。
[4]
echo;
で改行を出力します。
(コマンドプロンプト上での見た目を調節するため)
[5]
del
コマンドで一時ファイルを削除します。
Mac
以下のコマンドで変換できます。
printf "$1" | base64
使い方
base64.sh 文字列
動作説明
printf
は第一引数に与えられた文字列を改行を含まずに標準出力に出力します。$1
には第一引数が格納されています。
base64コマンドは、標準入力で与えられた文字列をbase64に変換した結果を出力しますので、printfの結果をパイプすることでbase64コマンドに渡しています。