ShellScript
Mac
Windows
base64
batch

文字列を1行のbase64に変換するスクリプト

More than 1 year has passed since last update.

WindowsやMacで文字列を1行のbase64に変換するサンプルスクリプトです。
@DamashiGami様、@norisio様にいただいたコメントを反映しました。ご指摘ありがとうございます。

Windows

標準で提供されているcertutilを使用します。
certutilでbase64に変換するには入出力がファイルでなければならないので、少し使いづらいです。
そこで、以下のbatchスクリプトを作成しました。

base64.bat
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

以下のコマンドで変換できます。

base64.sh
printf "$1" | base64

使い方

base64.sh 文字列

動作説明

printfは第一引数に与えられた文字列を改行を含まずに標準出力に出力します。$1には第一引数が格納されています。

base64コマンドは、標準入力で与えられた文字列をbase64に変換した結果を出力しますので、printfの結果をパイプすることでbase64コマンドに渡しています。