1. ホーム
  2. スクリプト・コラム
  3. DOS/BAT(ドス・バット

BATが空間のある時間を手に入れるための解決策

2022-01-01 23:25:48

最近、あるプロジェクトでファイルを定期的にバックアップする必要があり、BATファイルを使ってフォルダ名を秒単位で自動生成していました。

batスクリプトの時間は以下のように設定されています。

pushd E:\Test
set T=%date:~0,10%-%time:~0,2%%time:~3,2%%time:~6,2%
md %T%
popd

time変数の値が以下の場合、各操作の意味は以下の通りです。

time:~0,2% は、左右のポインタを0ビットずつ右に移動し、移動した位置から2文字を抜き出し、時間フィールドの値を生成することを意味します。
time:~3,2% は、ポインタが左から右に3ビットシフトされ、オフセットから2文字が抽出され、分フィールドの値となることを意味します。
time:~6,2%は、ポインタが左から右に6ビットシフトされ、オフセットから2文字が抽出され、秒フィールドになることを意味します。

time:~0,2%%time:~3,2%%time:~6,2% を使うと問題があります。つまり、TIME が 08:00 ならコンピュータは 08 と表示しますが、実は %time:~0,2% で取り込むと、スペース +8 を取り込むので、md でフォルダを作るときに T にスペースが入っているので 2 つのフォルダができてしまうという問題があるのです。

例えば、今の時刻は、2019-08-23, 08:30:30です。

T = 20190823- 83030

md %T%は、20190823-と83030のように2つのフォルダを作成します。

回避策

時間を別のhとして定義し、hの中のスペースをゼロに置き換えてから、T:にhを追加してください。

set h=% =0% -> ここで '=' は '置換' を意味します。

pushd E:\Test
set h=%time~0,2%
set h=% =0%
set T=%date:~0,10%-%h%%time:~3,2%%time:~6,2%
md %T%
popd

BAT時間空間問題の解決策についての記事は以上です。BAT時間空間問題の詳細については、スクリプトハウスの過去記事を検索するか、以下の記事を引き続き閲覧してください。