Widowsバッチファイルの文字列整形を時刻表示を使って学ぶ

MS-DOS

Windowsバッチファイルでは文字列整形が可能です。
これを使って timeコマンドで取得できる時刻形式 9:51:53.8109時51分53秒のように表示してみます。

今回紹介するプログラムはコメント文をのぞくと6行ほどの短いものです。
詳しく解説をしているつもりですのでWindowsのバッチファイルを学びたい方は参考にしてください。

具体的には以下のようなことをして、 timeコマンドで取得できる時刻形式 9:51:53.8109時51分53秒に変換します。

  1. 変数に現在時刻の文字列を格納する
  2. 格納した時刻文字列の特定の文字を置換する
  3. 文字列から指定範囲を取り出し整形した時刻を表示する

上記では3種類の処理をしていますが、Windowsバッチファイル上では、全てsetコマンドで可能です。

setコマンドについての詳しい使い方を見たい方は、コマンドプロンプト上で

help set

と実行してください。setコマンドの詳しい使い方マニュアルを見る事ができます。

事前知識

コマンドプロンプト上で timeコマンドを実行したときに表示される時刻の形式は hh:mm:ss.ms となります。(以下の画像の時刻は 10時51分53秒81ミリ秒 という意味です)

またバッチファイルでは環境変数というものが利用できます。
環境変数はもともと定義されている変数でグローバルな形でどこからでも値を得ることができます。

環境変数のうち %time% にはtimeコマンドで取得される形式の文字列が格納されます。

例えば

echo %time%

とすると現在時刻が以下のような感じで表示されます。

 9:51:53.81

注意点としては、先頭のhhの部分に関しては1桁の時刻(例えば9時)などの場合、先頭に半角スペースが入ります。なぜか以外の分、秒、ミリ秒の部分は0埋めされて必ず2桁になります。

ここまでが事前知識です。

  • バッチファイルでは現在時刻を %time% で取得できる
  • 現在時刻の先頭の時刻部分は1桁の時間だと先頭に半角スペースが入る

実際のプログラム

現在時刻を日本語の時分秒で表示してくれるバッチファイルを作りました。

実行すると

09時51分53秒

のように表示されます。

mytime.bat

@echo off

:時刻を取得(0埋めにして整形)
:	ex) 9:18:11.95 -> 09:18:11.95
set NOW=%time: =0%

:時分秒をそれぞれ変数hour, minute, secondに格納
set hour=%NOW:~0,2%
set minute=%NOW:~3,2%
set second=%NOW:~6,2%

:時刻を整形して表示 ex) 04時38分50秒
set CURRENT_TIME=%hour%時%minute%分%second%秒
echo %CURRENT_TIME%

解説

mytime.bat ではコメント文(REM)の代わりに:(コロン記号)を使っています。
REM文で書くと猥雑な感じがするからです。(気にしないでください)
本来の:の使い道はプログラム行に対する場所を表すラベル機能を持ちます。

@echo off 以下順を追って解説します。

set NOW=%time: =0%

変数NOWに現在時刻の環境変数である%time%を設定しています。(: の後に半角スペースが1文字入っていることに注意して下さい)

set NOW=%time%

とすれば現在時刻が取得できるのですが、%time: =0%としているのには意味があります。

setコマンドの文字列置換機能があり、構文は以下の通りです。

%変数名:置換したい文字列=置換後の文字列%

例えば変数hogeにCATという文字列が入っていたとして、%hoge:C=B%とすれば、BATという文字列に置換されます。

確認用サンプルプログラム

tikan.bat

@echo off
set hoge=CAT
echo %hoge%

REM 文字列置換
set hoge=%hoge:C=B%
echo %hoge%

というわけで、set NOW=%time: =0% とした場合、変数NOWにある半角スペースが「0」という文字に置換されるわけです。

例えば 変数NOWの文字列が” 9:18:11.95”(先頭半角スペース)だとすると実行後は、”09:18:11.95”に置き換わるということです。

今回、時分秒を全て0埋めで2桁表示にするためにこの処理があります。

次に文字列から指定範囲を取り出す処理です。

:時分秒をそれぞれ変数hour, minute, secondに格納
set hour=%NOW:~0,2%
set minute=%NOW:~3,2%
set second=%NOW:~6,2%

文字列の取り出しにも指定構文があります。

%変数名:~開始インデックス,取り出す文字数%

開始インデックスは、先頭文字を0としています。
例えば変数hogeにABCDEという文字列が入っていた場合、%hoge:~1,3% とすれば文字列BCDが取り出すことが出来ます。

例えば変数NOWの文字列が”09:18:11.95”だったとすると、

set hour=%NOW:~0,2%
set minute=%NOW:~3,2%
set second=%NOW:~6,2%

を実行後の変数の値は

hour=09
minute=18
second=11

となるわけです。

最後は、変数hour, minute, second に取得した値を整形して表示する部分です。

:時刻を整形して表示 ex) 04時38分50秒
set CURRENT_TIME=%hour%時%minute%分%second%秒
echo %CURRENT_TIME%

ある変数に変数の値を代入するには、=(代入演算子)の後に変数名を%変数名%という形でくくって表現します。

%hour%, %minute%, %second%がそれぞれ変数の値に置き換わるため、

CURRENT_TIME=091811

となるわけです。

変数値を画面に出力する場合も同様に echo %変数名% と記述しますので、echo %CURRENT_TIME% として最後に変数CURRENT_TIMEの値が表示されます。

09時18分11秒

バッチコマンドの使い方を知るには?

バッチファイルで利用できるバッチコマンドはその場でマニュアルを

help コマンド名

としてみる事ができます。

例えばforコマンドのマニュアルならhelp forとしてみる事ができます。
ぜひ活用してみてください。

コメント

タイトルとURLをコピーしました