以前、Winows環境であるフォルダ内のファイル名をまとめてに変更してみようと、調べたコマンドを実行してみたところ、”重複するファイル名が存在するか、またはファイルが見つかりませんでした。”といったエラーが発生し、原因が分かるまで少し苦労した。
原因はコマンドプロンプトの遅延環境変数の設定だった。コマンドプロンプトで使用する変数というのは、コマンド読み込み時に一度だけ値をセットするというのが既定の動作で(例えばFor (…..)で一度だけ)、処理ごとに値をセットするためには遅延環境変数を有効とした上で実行する必要があった。
以下、コマンド実行手順を記載しておく。
例:以下ファイルのファイル名のK社をM社へまとめて変更したい場合
まず、Windowsキー+R、もしくはスタートメニューの”プログラムとファイルの検索”、あるいはcortana(”何でも聞いて下さい”のところ)で”ファイル名を指定して実行”と入力して、ファイル名を指定して実行ダイアログを開き、”cmd /v”と入力してOKをクリック。(※説明①)
遅延環境変数有効の状態で起動したコマンドプロンプト画面でファイルのあるフォルダへ移動
以下のコマンドを入力し実行(※説明②)
For %i in (*) do (
set fnm=%i
set fnm=!fnm:K社=M社!
ren %i !fnm!
)
ファイル名が変更される。
※説明①
“/v” オプションを付ける事で遅延環境変数が有効の状態でコマンドプロンプトを起動できる。※バッチファイルではSETLOCAL ENABLEDELAYEDEXPANSION と記載すると同様の動作となる。
遅延環境変数有効の状態で変数を!(エクスクラメーション)で囲むと処理実行ごとに値をセットすることができる。
※説明②
コマンドの内容説明
For %i in (*) do ( →ファイル名を%iにセットしてファイル数ぶん処理を実行
set fnm=%i →変数fnmにファイル名をセット
set fnm=!fnm:K社=M社! →変数fnmにセットされたファイル名内のK社をM社に置換
ren %i !fnm! →ファイル名%iを変数fnmにセットされたファイル名に変更
)
※追:1行目のin(*)をin (*.txt) とすればテキストファイルのみ、in (*2017*.txt)のようにすれば2017が含まれるファイルのみ対象にすることも可能になる