スポンサーリンク

バッチファイルで,ログや日報のローテーションをする (環境変数の部分文字列を抽出する方法)



コマンドプロンプトで,「ファイル名に日付を含むようなファイル」を簡単にローテーションできる。(フォルダもOK)


例えば毎日,デスクトップにその日の作業メモを保存しているとしよう。

ファイル名は「memo081205.txt」のように,その日の日付を含んでいるとする。


朝,作業を始めるときには,毎回

  • デスクトップにある昨日のメモファイルを,メモ保管用フォルダにコピペする。
  • デスクトップにある昨日のメモファイルを,今日の日付にリネームする。

といった操作を行なう事になる。


この毎日繰り返される操作を,バッチでワンクリック化する。



下記の内容を,デスクトップに rotate_memo.bat のような名前で保存。

@echo off

rem カレントディレクトリのメモをローテーションします。
rem メモのファイル名形式: memo081231.txt

set MEMO_SAVE_DIR=D:\memo

for %%V in ( memo*.txt ) do (
  copy /-Y %%V %MEMO_SAVE_DIR%
  ren %%V memo%date:~2,2%%date:~5,2%%date:~8,2%.txt
)

@pause


このbatファイルをダブルクリックで実行すると,デスクトップにあるメモファイルは,メモ保管用フォルダにバックアップされる。

もしバックアップ時に以前のファイルと名前が重複している場合は,上書き確認が表示される。


そしてデスクトップ上のメモファイルは,今日の日付にリネームされる。

  • 日報
  • アプリケーションのログ
  • TODOリスト

などにも使えるかもしれない。



単純な動作だが,このようにWindowsのシェルだけで一応のローテーションができるのだ(ここでは手動だけど)。


WSHで書こうとして Scripting.FileSystemObject のスペルを間違えないか心配したり, WScript.CreateObject と new ActiveXObject のどっちを使うんだったか思い出す手間もない。


copy と書けばそれだけでコピーして,ren と書けばそれでリネームされるその愚直さが,むしろコマンドプロンプトの取り柄なのではないか。



以下はソースコードの概説。

(1)for文で複数行の処理を行なう

for (〜) do(
〜
〜
)

とすればループ中で複数行の処理が実行できる。

(2)環境変数の文字列中から,部分文字列を切り出す (バッチファイル中限定)

%VARNAME% という環境変数があったとして,

%VARNAME:~3,2%

とすれば,4文字目から数えて2文字分を切りだしてくれる。


例えば,システム環境変数の例でいくと

echo %ProgramFiles:~0,2%
@pause

とすれば,PC内で Program Files が存在するドライブを表示する。( C: のように)


また,

echo %TIME:~3,2%
@pause

とすれば,現在時刻のうち分だけを表示してくれる。


※TIMEやDATEは利用地域によって形式が異なるので注意。



したがって,例えばWindowsのコマンドプロンプトからOpenSSH経由でLinuxに接続し,dateコマンドで時刻を設定する場合は,下記のようなバッチファイルになる。

bashに合わせて,「月日時分年」で出力している。

ssh root@(IPアドレス) "date %DATE:~5,2%%DATE:~8,2%%TIME:~0,2%%TIME:~3,2%%DATE:~0,4% 2>&1 "

【 date 】 日付や時刻を表示,設定する
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230739/

後ろから抽出したり,環境変数中の文字列を置換したりすることもできる。

下記のURL参考を参考にするか,もしくは set /? でsetコマンドのヘルプを見ると,使い方の解説が詳しい。

バッチ・ファイル中で日付をファイル名に使用する
http://www.atmarkit.co.jp/fwin2k/win2ktips/419batchdate/batchdate.html#