Windowsのコマンドプロンプトやバッチファイル(batファイル)内のコマンドで「時刻」を取得し表示や出力したいシーンがあると思います。
時刻によって処理を判断するためにとか、ログファイルのファイル名に時刻を入れたいなどです。
コマンドプロンプト(バッチ)ではtime.exe というプログラムが用意されていて呼び出すと時刻を取得できるのですが、このまま使えないシーン(後述します)が出てきます。
さて、時刻を取得した後にどのようにして自分が使いたいように加工するか?
この記事では、コマンドプロンプト(バッチ)で時刻を取得し加工するTipsを説明したいと思います。
簡単なので、是非見ていってください。
ちなみに、日付を取得する記事も投稿しているので併せて読んでもらえると日付+時刻の取得方法がご理解戴けると思います。
関連記事:Windowsコマンドプロンプト(バッチファイル)で日付取得するdateコマンドの使い方
コマンドプロンプト(バッチ)の時刻取得はtimeコマンドを使う
早速ですが、コマンドプロンプト(バッチ)で時刻を取得する方法をご案内します。
time
コマンドプロンプトでtimeと打ってEnterを押してください。
現在の時刻: 13:19:59.83 新しい時刻を入力してください:
こんな感じで出てくるはずです。今回は何もしないので、更にEnterを押して抜けて下さい。
通常のtimeコマンドは日付取得というよりは、Windowsの時刻を変更するコマンドとなっています。
上記の文字列で時刻部分を取得→加工 でも出来なくはないですが、制御がめんどくさいですよね。
timeコマンドを%で囲むと日付取得できる
では、timeコマンドで日付取得できる方法は?というと
echo %time%
- echo(エコー)は文字列をプロンプトに表示するコマンド
- %time% はtime.exeで出力された内容を文字列にする
上記コマンドを打ってEnterを押すと
13:20:14.29
と、HH:MM:SS.99形式でシステム時刻が表示されるはずです。
%time% で時刻が取得できます。(time自体がWindowsの中では環境変数となっているわけです)
取得した内容を変数に格納したり、ファイルに書込んだりすれば良いわけです。
ここまではとても簡単ですよね。(以下一例です)
例:コマンド
echo %time% Windowsコマンドプロントに出力。> c:\temp\test.log
- echo(エコー)は文字列をプロンプトに表示するコマンド
- %time% はtime.exeで出力された内容を文字列にする
- Windowsコマンドプロンプトに出力。 という文字列を %time%の後に加える
- 「>」は、C:\temp\test.log に%time% Windowsコマンドプロンプトに出力。 という文字列を上書きモードで出力する
関連記事:コマンドプロンプトやバッチで実行結果をファイルに出力する簡単な方法
例:コマンド結果(test.log の中身)
13:20:14.29 Windowsコマンドプロンプトに出力。
timeコマンドで得た値を加工する方法
では、timeコマンドで得た値(時刻)を色々加工する方法をご案内します。
デフォルトはHH:MM:SS.00形式でしか取り出せないですが、時刻は色んな使い方をすることがあると思うのです。
- 「時」だけを取り出したい
- 「分」だけを取り出したい
- 「秒」だけを取り出したい
- HHMMSS(スラッシュを取り除いた状態)で使いたい
などなど。
timeコマンドは、以下内容を覚えておけば、時分秒の一部分だけを取り出すことが出来ます。
これはバッチファイルでバッチを組んだ場合に良く使いますので覚えておきましょう。
time:~A,B で一部分を取り出せます
以下構文でtimeコマンドで出力される内容(文字列)の一部分を取り出すことが出来ます。
echo %time:~A,B%
分かりにくいのでtime以下の詳細を。
time+ ”:(コロン)”+”~(チルダ)”+(A:開始文字番号)+”,(カンマ)”+(B:取り出す文字数)
となっています。
開始文字番号は以下のように指定します。0番目から始まっていることに注意が必要です。
timeコマンドで返ってくる結果が「13:20:14.29」であれば、
- 1→0番目(13:20:14.29)
- 3→1番目(13:20:14.29)
- :→2番目(13:20:14.29)
- 2→3番目(13:20:14.29)
- 0→4番目(13:20:14.29)
- :→5番目(13:20:14.29)
- 1→6番目(13:20:14.29)
- 4→7番目(13:20:14.29)
- .→8番目(13:20:14.29)
- 2→9番目(13:20:14.29)
- 9→10番目(13:20:14.29)
※赤字部分が開始文字番号
となります。
一例を挙げると
13:20 を取り出したい場合。
echo %time:~0,5%
となります。
timeコマンドで「時(HH)」だけ取り出したい
例:13:20:14.29 で13を取り出す
echo %time:~0,2%
とすると「13」を得ることが出来ます。
timeコマンドで「分(MM)」だけ取り出したい
例:13:20:14.29 で20を取り出す
echo %time:~3,2%
とすると「20」を得ることが出来ます。(時刻の「:(コロン)」も文字数に入れることに注意!)
timeコマンドで「秒(SS)」だけ取り出したい
例:13:20:14.29 で14を取り出す
echo %time:~6,2%
とすると「14」を得ることが出来ます。(時刻の「:(コロン)」も文字数に入れることに注意!)
timeコマンドでHHMMSSと加工する方法
さて、今までtimeコマンドで得られる値を加工する方法を案内してきました。
これらを使えば、HHMMSS(時刻のスラッシュなし)で加工することも勿論可能です。
スラッシュ無しで加工するシーンは色々考えられますが、ファイル名に時刻を入れたい場合なんかが当てはまりますよね。(ファイル名に「:(コロン)」を入れることが出来ないので。)
例:timeコマンドで得られた「13:20:14.29」 を「132014(HHMMSS)」に加工する
echo %time:~0,2%%time:~3,2%%time:~6,2%
となります。要は今まで出来てた内容を組み合わせただけで意外とシンプルです。
見た目はちょっと分かりにくいですが。
date:/= のような文字列変換は使えない
dateコマンドであれば、%date:/=% で出力(echoコマンドなどで)できるのですが、timeコマンドではこれは使えません。
関連記事:Windowsコマンドプロンプト(バッチファイル)で日付取得するdateコマンドの使い方
何故ならば、timeコマンドの戻り値に「:(コロン)」と「.(ドット)」が混在しており両方を一気に変換できないのと、小数点以下を切り捨てる処理が必要だからです。
もしやるとするならば、一度コロンやドットを変換して変数に格納し、格納した変数からさらに変換→そして小数点以下を切り捨てればできないことはない。
でもちょっと面倒ですよね?
date+timeコマンドを使い当日日付時刻のログファイルを出力する(例)
最後にまとめとなりますが、dateコマンド・timeコマンドを使った当日日付時刻のログファイルを出力する一例をご紹介して当記事は終わります。
date+timeコマンド意外と使いますので、色々ためしてみて下さい!
date+timeコマンドで当日日付:YYYYMMDDHHMMSS(今回は2018/09/10 11:22:33)をファイル名(log20180910112233.txt)にしてログを出力する例
echo こんばんは、お元気ですか? > c:\temp\log%date:/=%%time:~0,2%%time:~3,2%%time:~6,2%.txt
関連記事:コマンドプロンプトやバッチで実行結果をファイルに出力する簡単な方法
ファイル(log20180910112233.txt)の中身
こんばんは、お元気ですか?