MicrosoftがリリースしているOS「Windows 7」は、GUI(グラフィカルユーザーインタフェース)を主なUI(ユーザーインタフェース)として採用していますが、CUI(コマンドラインユーザーインタフェース、またはキャラクタユーザーインタフェース)である「コマンドプロンプト」も用意しています。そこで本稿では、このコマンドプロンプト上で動作するコマンドや、特定の作業を自動化するバッチファイルを使用し、ライフハック的な活用方法を紹介していきます。

第3回は前回紹介した「move」コマンドの活用例を紹介しましょう。まずは下記のバッチファイルをご覧ください。一見しても何が何だかわからないと思いますので、ワンステップずつ解説します(リスト01)。また、実際に大事な写真などで行う場合には万一に備えコピーを作るなどしてバックアップしておいてから実行させるようにしてください。

リスト01

@echo off
setlocal enabledelayedexpansion
set n=1000
for /f "usebackq delims=" %%i in (`dir /b /o-n *.jpg`) do (
    set /a n+=1
    move "%%~i" "!n:~-3!.jpg"
)
endlocal

1行目の「@echo off」は、文字どおり実行コマンドを表示させないための命令です。行先頭に「@(アットマーク)」を付けているのは、自身のコマンドを表示させないために付けました。蛇足ですが「echo on」とすれば、各実行コマンド結果が表示されます。

2行目の「setlocal enabledelayedexpansion」ですが、前者はバッチファイル内で使用する環境変数をバッチファイル内で完結させるものであり、後者は遅延環境変数機能を有効するコマンドです。そもそも環境変数は単独として存在し、複数の機能を持つ環境変数が存在するわけではありません。

遅延環境変数機能は「%(パーセント)」の代わりに「!(エクスクラメーションマーク)」を用いることで、環境変数の展開をコマンド実行の直前に行なうというものです。ひとまず、この時点では「そのような機能がある」ことだけ覚えておいてください。

3行目の「set n=1000」は後述するとして、4行目の「for~」を解説しましょう。同行は7行目にある「)」までの処理を繰り返し行なうためのループ文です。「for」コマンドは「for %%変数名 in (セット) do コマンド名 [オプション]」という書式ループを実行し、上記分ではセットである「dir /b /on *.jpg」の実行結果を基にループを実行しています。

話は少々脱線しますが、「dir」コマンドオプションについて解説しましょう。「/b」はファイル名のみを表示するためのオプション。「/o」はファイルを並べ替えて表示するためのオプション。「/on」の場合、名前順になります。

つまり、リスト01のバッチファイルでは、コマンドプロンプトから「dir /b /on」と実行した際の表示内容を元にリネーム処理を行なう仕組みになっていますので、作成日時が古い順番で連番を割り振りたいときは「/od」と、オプション内容を変更してください。また通常は文字コードを元に値の小さい順番で表示する昇順が用いられます。この逆である降順にする場合は「/o-n」「/o-d」と「-(ハイフン)」を加えてください。

話を「for」コマンドに戻しましょう。最初に先ほど説明した構文にない「/f」オプションの存在にお気付きでしょうか。同オプションはセット内の文字列操作や判断を制御するためのもので、

「usebackq」オプションを指定することで「"(ダブルコーテーション)」で囲んだものをファイルとして認識し、ファイル内容でループを実行。「`(バッククォート)」で囲んだものをコマンドとして実行し、その結果でループを実行します。ちなみに「'(シングルコーテーション)」で囲んだ場合は文字列として処理が実行されます。もう一つの「delims」は区切り文字をセットするためのオプション。ここではどのような名前を持つファイル名でも対処するため、区切り文字を無効にしました。

それではループ文内部の実行コマンドに関して解説しましょう。まず5行目の「set /a n+=1」は3行目で指定した「set n=1000」を元に、変数nを実行するたびにインクリメント(1ずつ繰り上げる)するためのコマンド。この数値を元にリネーム後のファイル名を付けています。

6行目の「move "%%~i" "!n:~-3!.jpg"」が実際にリネーム作業を行なうためのコマンドライン。「move」コマンドの動作は前回説明したとおりですが、気になるのは「%%~1」といった表記ではないでしょうか。そもそもバッチファイル内で「%」単独で使用すると環境変数を表わすための記号として処理されてしまうため、変数を用いる場合は「%%」と表記しなければなりません。

この「%%~i」は変数iの値がダブルコーテーションで囲まれている場合、同記号を削除するためのものです。続く「!n:~-3!.jpg"」は前述した遅延環境変数を使用し、変数nの内容を遅延展開するというもの。「!」で囲むことで同機能が有効になります。

ポイントは「n:~-3」の部分。ここは変数nから指定数値(ここでは-3)を抽出しています。つまり本来であれば、「1001.jpg」という結果をベースに、後ろ3文字目から最後までを抽出することで「001.jpg」というファイル名を導き出しています。これはファイル名を「1.jpg」ではなく「001.jpg」とするための回避処置として用意しました。

今回はあくまでも「move」コマンドの応用編のため、同一フォルダ内のJPEG形式ファイルのみを対象にしましたが、4行目および6行目の拡張子部分を変更することで、ビットマップファイルやWord形式ファイルなどほかの形式にも対応できます。ただし、ドラッグ&ドロップなどファイルの与え方が異なる場合、異なるバッチファイルを用意しなければなりません。そのあたりは追って紹介していきますので、ご興味のある方は次回以降の本稿をご覧ください(図01~03)。

図01 リスト01の内容をメモ帳などに入力し、任意のファイル名(拡張子は「.bat」)で保存します

図02 バッチファイルを実行しますと、バッチファイルと同一のフォルダ内にあるJPEG形式ファイルを対象に

リネーム処理が行なわれます

図03 ご覧のように各画像ファイルが順番に3桁の数字を持つファイル名に変更されました。また、異なる形式のファイルはリネームされません

阿久津良和(Cactus