読者です 読者をやめる 読者になる 読者になる

Corredor

ウェブ、プログラミングの勉強メモ。

コマンドプロンプトでビープ音を鳴らす

2ch で見つけたネタ。

884 : デフォルトの名無しさん[sage] 投稿日:2017/01/27(金) 21:16:38.29 id:ss8+Q0ea.net
こういうのもここで覚えたよ
for /f “delims=0” %%I in (‘cmd /u /c echo 〇’) do set BEL=%%I
echo %BEL%

BEL 文字でビープ音が鳴らせる

元々、コマンドプロンプト上でアスキーコード「7」の「BEL 文字」を Echo すると、コマンドプロンプトからビープ音が鳴らせるということは知っていた。

Rem 「^G」はコマンドプロンプト上で「Ctrl + G」とキー押下すると入力できる
Echo ^G

この「BEL」「^G」とは、制御文字の一つで、その名のとおり、この文字を受け取った端末のベル (ビープ音) を鳴らす特殊な文字なのである。制御文字というと、ターミナルで Backspace を打って ^H という文字が出てくるのを見かけたり、得体の知れないシェルスクリプトを Vim で開いたときに行末に ^M が付いているのを見かけることがあるかもしれない。これらはそれぞれ、「後退」「キャリッジリターン」を意味していて、キャリッジリターンは \r というエスケープシーケンスや CR という略号でも知られているであろう。

BEL 文字をどうやってバッチファイルに書き込むか

コマンドプロンプト上の「^G」というこの表示は、Ctrl + G というキー操作で入力されたアスキーコード「7」を、「^G」というキャレット記法で表現しているものである。

従って、「キャレット」「G」という2文字を入力してもビープ音は鳴らせない。

そのため、ベルを鳴らすバッチファイルを書こうとすると、少々厄介だ。

まず、Windows 標準の「メモ帳」だと、制御文字を表示したり挿入したりできないのである。

個人的に使用している「Notepad++」なら、「制御文字の表示」というオプションがあるので、「文字コード表」から BEL 文字を入力してそれを閲覧できたりするが、エディタを用意して表示設定を変えて制御文字を入力する、と、少々面倒だったりする。また、こうして書いたバッチファイルを「メモ帳」で開くと、「^G」などの表示はされないので、BEL 文字が入力されているのかどうかやはり判別できないのである。

そこで Unicode

そこでようやく冒頭のコードだ。

少し改変して、コマンドプロンプト上で直接入力できるようにしたものを以下に置いておく。

For /f "delims=0" %a In ('Cmd /u /c Echo 〇') Do @Echo %a

これを実行すると、ビープ音が鳴る。

コード中に制御文字が隠れているワケではない。キモなのは、コード中にある漢数字のゼロ「〇」だ。

これは「まる」で変換して出せる円記号「○」(U+25CB) ではなく、「ぜろ」で変換して出せる漢数字の零「」(U+3007) である。

んで、これを For 内にある Cmd コマンドを挟んで Echo しているのだが、Cmd コマンドのスイッチ (オプション) に /u というものが付いている。

Cmd /u とすると、コマンドの実行結果を Unicode 形式で返却してくれる。デフォルトは ANSI で、/a スイッチを指定したのと同義なのだが、/u とすることで Unicode にできる。

この機能を利用し、漢数字の零を Unicode 形式にして返却させることで、For 文の変数 %a にはベル文字が入るということになるのである。そしたらそれを @Echo してやることで、ビープ音が鳴らせるという寸法だ。

冒頭のコードは、バッチファイル内で変数 BEL にベル文字を入れていることになる。