質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

2回答

2268閲覧

バッチファイルでの拡張子リネーム処理

wayh

総合スコア0

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

1クリップ

投稿2020/08/20 07:30

編集2020/08/20 07:31

バッチファイルの作成

拡張子以降をリネームするバッチファイルを作成したいです。
具体的なイメージとしては、
aaa.txt_bk → aaa.txt
aaa.xls_bk_bk → aaa.xls
のような拡張子の後ろにアンダースコアで始まるサフィックス部分を削除して、
通常の拡張子へ戻すということを実現したいです。
複数回アンダースコアが出現する場合もあります。
通常の拡張子となる部分はどのような拡張子が来ても問題ない作りとしたいです。

現在のソースコード

set target_dir="実行ディレクトリを指定" for /R %target_dir% %%i in (*.*_*) do ren %%i %%~ni

この状態で実行すると通常の拡張子もすべて削除され、拡張子なしファイルとなってしまいます。

具体的なコード例のご教授お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

コマンドプロンプトバッチは手間がかかる割にできることが少ないです。
今のWindowsならPowershellが使えますので、そちらを使うことをお勧めします。
powershellでリネームしたいファイルのあるディレクトリパスに移動して

powershell

1Get-ChildItem -Name | rename-item -NewName { $_ -replace '([^_]+)(?:_bk)+','$1' }

これを実行していただければリネームできるはずです。

追記
そのエラーはリネーム前と後が同じ名前を指定すると出るエラーです。
置換処理を入れても名前が変わらないファイルがあったってことですね。

そしてディレクトリを再帰的に処理するコマンドはこれです。
-Recurseの前にディレクトリ名を入れていただければそこから、
無指定ならpowershellの現在のディレクトリから、
再帰的に配下のサブディレクトリ内のファイルのみをリネームします。

再追記
ikadzuchiさんご指摘ありがとうございます。
正規表現に問題がありますね。
とりあえず例で挙げられてるのだけ処理できるように書いたので。
具体的には一番右のピリオドより右のアンダースコアより右の文字を切り捨てる。
という正規表現に修正しました。
これならば
test.test_bk_test.txt_bk2_bk_bn → test.test_bk_test.txt
こういう置換ができます。

powershell

1Get-ChildItem renamefile -Recurse * | ? { ! $_.PSIsContainer } | rename-item -NewName { $_.name -replace '(.+.[^_]+)_.+','$1' }

投稿2020/08/20 07:59

編集2020/08/20 22:35
yureighost

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wayh

2020/08/20 08:26 編集

ご回答ありがとうございます。 PowerShellのほうが高機能なのですが、なかなか手が出せていない状況です。 実行時に下記のエラーが出現しています。 rename-item : ソースパスとターゲットパスを同じにすることはできません。 ...rename-item -NewName { $_ -replace '([^_]+)(?:_bk)+','$1'... エラー文は波線の引かれている部分のみ抽出しました。 ただし、エラー文が出ていますが、リネームは行えていましたので、目的は達成しています。 ありがとうございました。コマンドプロンプトやWPSに不慣れなため大変助かりました。 後学のためにこちら指定ディレクトリから再帰的にサブフォルダを含めてリネームをする際の方法ももしよろしければ教えていただけますと幸いです。
ikadzuchi

2020/08/20 16:25

質問文を読む限りサフィックスは「_bk」に限らないのではないでしょうか。 また、ファイル名中の拡張子以外の部分に「_bk」が含まれる場合も置換されてしまいます。
guest

0

アンダースコア以降を取った拡張子を4文字までとして、

CMD

1set target_dir="実行ディレクトリを指定" 2for /R %target_dir% %%i in (*.*_*) do call :sub "%%i" 3exit /b 4 5:sub 6set X=%~x1 7if "%X:~2,1%"=="_" ( 8 set X=%X:~0,2% 9) else if "%X:~3,1%"=="_" ( 10 set X=%X:~0,3% 11) else if "%X:~4,1%"=="_" ( 12 set X=%X:~0,4% 13) else if "%X:~5,1%"=="_" ( 14 set X=%X:~0,5% 15) else ( 16 echo 拡張子のエラー "%1" 17 exit /b 18) 19ren %1 "%~n1%X%" 20exit /b

5文字以上も対象にするなら、ifを必要なだけ並べてください。

投稿2020/08/20 08:30

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問