エンジニアブログ

ファイルを一括リネームするバッチファイルを作る

2019.12.07

背景

サーバーのログファイルを取得して特定のフォルダに保管するという作業があったのですが、複数の同名ログファイルがあるので取得したら一括でリネームしたい。

作業端末がWindows10なので簡易的なバッチファイルを書いてみることにしました。

こんな感じにしたい

リネーム後のログファイル名は、

  • サーバ1で取得したログ 〇〇〇〇.log → 〇〇〇〇_server1.log
  • サーバ2で取得したログ 〇〇〇〇.log → 〇〇〇〇_server2.log

のように末尾にサーバ名を付加する。
なお元のログファイル名の長さはどのファイルも同じ長さです。
またリネームしたいファイルとバッチファイル以外のファイルはフォルダに置かないようにします。

できたバッチ

@echo off

set /P STR_INPUT="サーバ1なら1を、サーバ2なら2を入力:"

IF %STR_INPUT%==1 (
set serverName=server1
) ELSE IF %STR_INPUT%==2 (
set serverName=server2
) ELSE (
echo 1か2を入力してください
pause
goto :EOF
)

for %%f in (*.log) do call :sub %%f
echo リネーム完了
pause
goto :EOF

:sub
rename ?????.log ?????_%serverName%.log
goto :EOF

付加するサーバ名を選べるようにして、フォルダにある.logファイルを一括でリネームする、という簡単な内容です。

ただバッチファイルを作るのが初めてだったので、微妙にハマったところがいくつか。。。

ハマったところ

IFの書き方

IF文を書いたけどなぜか動かない。ネットで解説記事を読んでみても間違ってなさそう。。。

とよくよく調べてみると、

IF 条件式 (
    処理
)

文法としては上記のように書くのだが、条件式とカッコ( の間には半角スペースが必要と判明。
最初に書いたプログラムではスペースがなかったため、ちゃんと動いてませんでした。。。
ELSE IFやELSEの当該箇所でもスペースを入れ忘れるとIF文全体が機能しなくなるので注意。

pause

処理が完了したら「リネーム完了」と画面に表示するようにしたかったのですが、最初に書いたプログラムでは画面に表示されませんでした。コマンドプロンプトから起動すると表示されるのになんでだろう???

調べてみるとpauseが入っていないのが原因でした。
pauseを入れる理由は、バッチファイルを直接ダブルクリックで実行する場合、処理が完了するとすぐ画面が閉じてしまうため、echoでメッセージが表示されない。そのためpauseを入れることでメッセージを表示するところでいったん処理をとめる、ということが必要らしい。
なおtimeoutでも処理を指定の秒数分遅らせることができるとのこと。

?????について

個人的にはあんまりイケてないなあと思うところですが、今回リネームする対象のファイルはファイル名が一定であることからこのような処理としました。
?は文字を表しており、?????は半角5文字ということになります。たとえばaudit.logが対象だとすると、.logの前が半角5文字なので処理対象となります。なので文字数が異なるファイルがあると正しくリネームされないです。

できたはいいけど

作業端末だとセキュリティの関係でバッチファイルが動かなかった。。。

関連キーワード

この記事をシェアする

Facebook Twitter LINE はてなブックマーク

この記事を読んだ方に
おすすめの記事