• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フォルダー内の複数ファイル名を一括で変名するbat)

フォルダー内の複数ファイル名を一括で変名する方法

このQ&Aのポイント
  • Windowsのバッチファイル(.bat)を使用して、フォルダー内の複数のファイル名を一括で変更する方法について教えてください。
  • 具体的には、デスクトップに配置した.batファイルを使用して、フォルダーをドラッグアンドドロップして処理する形式で変名したいです。
  • 参考になりそうな記事を見つけましたが、うまく処理できなかったため、修正方法や別の方法を教えていただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.2

ダメ文字を含むファイルがあるかチェックして、 あれば中断するようにしてみました。 ひとつでもあれば中断します。 あまりいい方法ではないかも知れませんが、 既出の命令を使っているので、わかりやすかと思います。 とりあえず、%と#をダメ文字としています。 %は特殊な文字のため##と2回書いています。 ダメ文字にどんなものがあるのかわからないので、 「ファイル名 使わない」などで検索してみてください。 例えばこちらなど参考に。 https://all.undo.jp/asr/1st/document/01_03.html あとはダメ文字ひとつひとつをチェック処理のところに、 以下のような感じで追加してみてください。 for /F "delims=" %%f in ('dir /b *ダメ文字*') do call :dame ---- rem test.bat echo off cd "%1" call :check IF ERRORLEVEL==1 goto :dame_end for /F "delims=" %%f in ('dir /b') do call :sub "%%f" exit /b :sub set fname=%~1 set n=0 :loop call set c=%%fname:~%n%,5%% set /a n=n+1 if "%c%"=="" goto :EOF if "%c%"==" [com" goto break goto loop :break set /a n=n-1 set ext=%~x1 call set newname=%%fname:~0,%n%%% call set newname=%newname%%ext% if "%newname%"=="" goto :EOF if "%newname:~0,1%"=="." goto :EOF ren "%fname%" "%newname%" goto :EOF :check set n=0 for /F "delims=" %%f in ('dir /b *%%*') do call :dame for /F "delims=" %%f in ('dir /b *#*') do call :dame exit /b %n% :dame set n=1 exit /b :dame_end echo ダメファイルがあったので中断しました PAUSE ----

NuboChan
質問者

お礼

dell_OKさん、ダメ文字があると処理を中止するコードの修正をありがとうございます。 素人でも応用が利く形式なのでダメ文字を追加できて嬉しいです。 >とりあえず、%と#をダメ文字 #(ナンバー記号)は、こちらで試してみましたが  ダメ文字に指定しなくても問題なく処理できるようです。 以下ダメ文字を検討する上で以下のURLが参考になりそうなのでしばらくコードの試用後の処理確認を徹底して 処理できない事例が出たら「記号(文字)」を特定して 教えてもらった方法で「記号(文字)」を追加していきたいと思います。 https://imgur.com/MJB5S6f 大変お世話になりました。 問題はほぼ解決しましたが  この件で追加のアドバイス等有りましたらお願いします。

その他の回答 (2)

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.3

アドバイスと言うほどではないのですが、PowerShellを使うともう少し簡単にできそうな気がします。 例えば、以下のような1行で近いことができます。 Get-ChildItem -Path '* ``[com*]*' | Rename-Item -NewName {$_.Name -Replace 'com',''} これは [com*] を含むファイルを探して、そのファイルの名前を変更していく、と言うものです。 この書き方だと com を 削除するだけなのですが、正規表現を使って [com*] を削除するような書き方がありそうなので調べてみたのですが、これと言った情報を見つけられず断念してしました。 これだとバッチファイルの変数記号%は問題ありません。 とは言っても、PowerShellにはPowerShellのダメ文字があるかも知れませんが、バッチファイルよりも回避できる仕組みは用意されていそうな気はします。 はっきりしたことが言えなくてすみません。

NuboChan
質問者

お礼

dell_OKさん、アドバイス感謝します。 わざわざpowershellで処理できないか  調べていただいたようで感謝いたします。 Powershellは、bat(cmd.exe)の進化系で出来ることが広がっているようですが 初心者の私では、bat以上に着手が難しく正直難しすぎます。 教えていただいたbatを実際の運用に即して  使いやすいように少し改造することで十分実用になるので  powershellは、今回は考えないことにします。 >PowerShellにはPowerShellのダメ文字があるかも知れませんが 12/19 19:04で参考画像(URL)を記載していますが https://imgur.com/MJB5S6f 参考画像によるとPowershellで使えないダメ文字はCmdより少なく cmdで使えるがpowershellだけで使えないようなダメ文字は無いみたいです。 長々とお付き合いいただきありがとうございました。

  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.1

こんな感じでしょうか。 手直ししたのは、 1.ドラッグ&ドロップしたフォルダにディレクトリ移動 2.dir /*.mp4の部分を参考サイトと同じようにdir /bに 3.exit /*.mp4も同様にexit /bに 4.call set c=%%fname:~%n%,5%% 5文字に 5.if "%c%"==" [com" goto break 5文字分の比較に ---- rem test.bat echo off cd "%1" for /F "delims=" %%f in ('dir /b') do call :sub "%%f" exit /b :sub set fname=%~1 set n=0 :loop call set c=%%fname:~%n%,5%% set /a n=n+1 if "%c%"=="" goto :EOF if "%c%"==" [com" goto break goto loop :break set /a n=n-1 set ext=%~x1 call set newname=%%fname:~0,%n%%% call set newname=%newname%%ext% if "%newname%"=="" goto :EOF if "%newname:~0,1%"=="." goto :EOF ren "%fname%" "%newname%" goto :EOF ----

NuboChan
質問者

お礼

dell_OKさん、batコードの修正ありがとうございます。 数回試用の結果、一部を除いて思うような処理が出来ました。 教えてもらったコードは、検査する文字列とその文字数を変更すれば 他の場合でも応用が利くのでこれから多いに利用させていただきます。 改めてお礼申し上げます。 ’--------------------------------- 以下、付随の相談になりますが解決できそうならお願いします。 上記の「一部を除いて」ですが、 ファイル名に%(パーセント)がある場合、処理されません。 (苦肉の策で%を除いて削除後にbat処理して、出来上がったファイル名に  %を元と同じように追加しました。) エキスプロラーなどではファイル名に%(パーセント)は使用できますが batでは、%(パーセント)が有るファイル名は利用できないようです。 ダメ文字 = %(パーセント)以外で利用できない文字がありますか? 正式な呼び方は、判りませんがbatで利用できない「ダメ文字」が ファイル名にある場合は、エラー処理として  注意 : 「ダメ文字」のファイルがあります。 と通知メッセージをDOS画面に表示したいのですがどうすれば良いでしょうか? (ダメ文字を含まないファイル名については、通常の処理後に通知メッセージを表示する。)

関連するQ&A