前提・実現したいこと
コマンドプロンプトやPowerShell等、Windows標準機能の中で、下記のように複数ファイルのファイル名の一部を一括変更したいのですが、どのようにすればよいでしょうか?
ご教示お願いします。
現在のディレクトリから、最下層のファイルまで、ファイル名の中の[test1]の文字列を[test]に変更したいと思っています。 ファイル名のaaaやbbbやcccの文字やディレクトリのdddやgggの名前等は任意です。 ファイル数やディレクトリ数やディレクトリの階層数も任意です。 //置換前。 │ aaa[test1].txt │ bbb[test1].txt │ ccc[test1].txt │ └─ddd │ eee[test1].txt │ fff[test1].txt │ └─ggg hhh[test1].txt //置換後。 │ aaa[test].txt │ bbb[test].txt │ ccc[test].txt │ └─ddd │ eee[test].txt │ fff[test].txt │ └─ggg hhh[test].txt
試したこと
コマンドプロンプト
>ren *[test1].txt *[test].txt
現在の階層のファイルのみが名前変更されました。
最下層のサブフォルダまで一括で変更する方法はありませんか?
もしくは、ディレクトリは別コマンドで変更するとして、ファイルだけでも最下層まで一括で変更する方法はありませんか?
補足情報(FW/ツールのバージョンなど)
Windows 10
### 追記
@echo off ren *[test1].txt *[test].txt for /r /d %%A in (*) do ( pushd %%A ren *[test1].txt *[test].txt popd ) for /r /d %%B in (*[test1]) do call :rename %%B exit/b :rename set A=%1 ren %A% %A:[test1]=[test]% exit/b pause
### 追記②
pauseを打って、処理の経過を調べてみました。
@echo off ren *[test1].txt *[test].txt for /r /d %%A in (*) do ( pushd %%A ren *[test1].txt *[test].txt popd ) pause for /r /d %%B in (*[test1]) do call :rename %%B pause exit /b :rename set A=%1 echo %A% rem ren %A% %A:[test1]=[test]% ←ここをコメントアウトするかしないかでエラーメッセージの出る出ないが変わる。 exit /b
コメントアウトしなかった場合、echo %A%の後に下記エラーが出力される。
コメントアウトした場合はエラーメッセージが出力されない。
コマンドの構文が誤っています。
### 追記③
ren %A% %A:[test1]=[test]%
上記がフォルダ名の一部変更ができる書き方かと思うのですが、コードが理解できていないため、
質問1と質問2があります。
「フォルダ 名前 一部変更 ren」などで検索してるのですが、なかなか情報が出てきませんでした。
質問1。
追記②のrenをmoveに変えて、意図した処理はできました。
ただ、追記②のrenをmoveに変えた書き方ならば、サブルーチンで書かない方法でもできるのではないかと思ったのですが、コードの書き換えができませんでした。
下記のように試したりしました。
@echo off ren *[test1].txt *[test].txt for /r /d %%A in (*) do ( pushd %%A ren *[test1].txt *[test].txt popd ) for /r /d %%B in (*[test1]) do call :rename %%B move %B% %B:[test1]=[test]% exit /b
質問2。
最上位階層ではどのようにすればフォルダ名の一部変更ができますか?
@echo off ren *[test1].txt *[test].txt rem 最上位階層ではどうすればフォルダ名の一部を変更できますか? ren *[test1] *[test] ←これではフォルダ名は変更できない。 for /r /d %%A in (*) do ( pushd %%A ren *[test1].txt *[test].txt for /d %%B in (*[test1]) do call :rename %%B exit /b popd ) :rename set A=%1 echo %A% ren %A% %A:[test1]=[test]% exit /b
### 追記④
質問1
サブルーチンを書かない方法を試しているのですが、意図した処理になりませんでした。
@echo off ren *[test1].txt *[test].txt for /r /d %%A in (*) do ( pushd %%A ren *[test1].txt *[test].txt popd ) for /r /d %%B in (*[test1]) do ( move %%B %%B:[test1]=[test]%% )
コードを理解していないので、下記なども試してみました。
move %B %%B:[test1]=[test]% move %%B %%B:[test1]=[test]%% move %%B %B:[test1]=[test]%
質問2
サブルーチンを書く方は、
@echo off ren *[test1].txt *[test].txt for /d %%B in (*[test1]) do call :rename %%B for /r /d %%A in (*) do ( pushd %%A ren *[test1].txt *[test].txt for /d %%B in (*[test1]) do call :rename %%B exit /b popd ) :rename set A=%1 echo %A% ren %A% %A:[test1]=[test]% exit /b
フォルダ直下と、その下のサブフォルダまでは名前変更できたのですが、
そのさらに下のサブフォルダの階層は、ファイルもフォルダも名前変更されませんでした。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/12/21 17:02
2019/12/22 00:01
退会済みユーザー
2019/12/22 07:40 編集
2019/12/22 10:52
退会済みユーザー
2019/12/22 12:42
2019/12/22 12:48
退会済みユーザー
2019/12/22 14:33
2019/12/22 14:52
退会済みユーザー
2019/12/23 17:16
2019/12/24 05:02
退会済みユーザー
2019/12/24 14:48
2019/12/24 15:27
退会済みユーザー
2019/12/25 16:48
2019/12/26 00:22 編集
退会済みユーザー
2019/12/26 14:58