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

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

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

フォルダー内の複数ファイル名を一括で変名するbatを教えてください。 batは、デスクトップに配置して 処理するフォルダーをD&Dして処理させる形式をとしたいです。 以下のような形式です。  No1 aaaa bbbb [com : *********].zip を  No1 aaaa bbbb.zip に変名する。   (*******は任意の文字列) 例えば、 No1 aaaa bbbb [com : taken2110221100014].zip であれば No1 aaaa bbbb.zip に変名する。 以下が参考になりそうなので https://oshiete.goo.ne.jp/qa/9263608.html 記事中の助言を元に以下のようにコードを修正してみましたが うまく処理できませんでした。 bat(test,bat,test2.bat)のどこを再修正すれば希望の処理ができますか ? 希望は、下記ですが 「batは、デスクトップに配置して 処理するフォルダーをD&Dして処理させる形式をとしたいです。」 batを修正してもこのbatでは、D&Dで処理することは可能で無い場合は アドバイス又は他の参考なりそうなURLを紹介ください。 '------------------------------------------ rem test.bat echo off for /F "delims=" %%f in ('dir /*.mp4') do call :sub "%%f" exit /*.mp4 :sub set fname=%~1 set n=0 :loop call set c=%%fname:~%n%,1%% 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 '-------------------------------------- rem bat2.bat for /F "tokens=1* delims=[com" %%F in ('dir /b *.mp4') do echo move %%F[com%%G %%F.mp4 '--------------------------------------

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

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (740/5644)
回答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% (740/5644)
回答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% (740/5644)
回答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

  • ファイル名の変更(指定文字を置換)

    powershell(PS)では、カッコ([,])の有るファイル名は利用できません。 そこで、バッチ処理でPSに処理させる下準備でカッコを他の文字(xx)に置換した ファイル名に変名したいと思います。 (PSで処理後に再置換して元のファイル名に戻す予定) 例えば、  [品番001]_Model_s0023.jpeg を  xx品番001xx_Model_s0023.jpeg に変名する。 以前教えてもらったbatを変更して以下のように修正しましたが うまく処理できませんでした。 どのように修正すれば良いでしょうか ? '------------------------------------------------ @echo off rem 該当するファイルを書き換える(カッコ>xx変換) for %%f in ( *.jpeg ) do call :sub "%%f" exit /b :sub set fname=%1 set fname=%fname:[=xx% set fname=%fname:]=xx% ren %1 %fname% goto :EOF

  • サブフォルダ内含め全てのファイル名を一括置換するw

    サブフォルダ内含め全てのファイル名を一括置換するwindowsバッチ処理について ファイル名の「YYYYMM」部分を一括で変換したく以下の様なバッチ文を記載しました。 しかし置換処理がうまくいかず、ファイル名の後ろに入力文字列がくっついてしまいます。 set /p YYYYMM="年月を入力してください(yyyymm形式):" echo %YYYYMM% for /r %%f in ( * ) do call :sub %%f %YYYYMM% pause exit /b :sub echo %2 set fname=%~nx1 set fname=%%fname:YYYYMM=%2%% echo %fname% ren %1 %fname% goto :EOF 環境上、ファイル名リネームソフトやWindows Powershellを使うことができないため、何とかバッチ処理で楽をしたいのですがかなり煮詰まってしまい。。。 どなたかアドバイスをお願いできないでしょうか。 よろしくお願いいたします。

  • winのbatで複数ファイルのD&Dに対応させたい

    windows7で、ドラッグアンドドロップしたファイル名を全角から半角に変換するbatファイルを作成しています。 1つ1つD&Dして変更させることは出来たのですが、複数まとめてD&Dしても対応出来るようにしたいのですが、どのようにしたら良いのでしょうか。 ネットでいろんなサイトを見ながら作ったので、無駄なコマンドがあるかもしれません。 効率の悪いこともしているかもしれません。 いろんなサイトを見ても、よく理解出来なかった為、見よう見まねでやったらとりあえず動いたというレベルです。 ====== echo on for %%f in ( "%~n1.*" ) do call :sub "%%f" exit /b :sub set fname=%1 set fname=%fname:A=A% set fname=%fname:B=B% set fname=%fname:C=C% set fname=%fname:D=D% set fname=%fname:E=E% set fname=%fname:F=F% set fname=%fname:G=G% set fname=%fname:H=H% set fname=%fname:I=I% set fname=%fname:J=J% set fname=%fname:K=K% set fname=%fname:L=L% set fname=%fname:M=M% set fname=%fname:N=N% set fname=%fname:O=O% set fname=%fname:P=P% set fname=%fname:Q=Q% set fname=%fname:R=R% set fname=%fname:S=S% set fname=%fname:T=T% set fname=%fname:U=U% set fname=%fname:V=V% set fname=%fname:W=W% set fname=%fname:X=X% set fname=%fname:Y=Y% set fname=%fname:Z=Z% set fname=%fname:a=a% set fname=%fname:b=b% set fname=%fname:c=c% set fname=%fname:d=d% set fname=%fname:e=e% set fname=%fname:f=f% set fname=%fname:g=g% set fname=%fname:h=h% set fname=%fname:i=i% set fname=%fname:j=j% set fname=%fname:k=k% set fname=%fname:l=l% set fname=%fname:m=m% set fname=%fname:n=n% set fname=%fname:o=o% set fname=%fname:p=p% set fname=%fname:q=q% set fname=%fname:r=r% set fname=%fname:s=s% set fname=%fname:t=t% set fname=%fname:u=u% set fname=%fname:v=v% set fname=%fname:w=w% set fname=%fname:x=x% set fname=%fname:y=y% set fname=%fname:z=z% set fname=%fname:1=1% set fname=%fname:2=2% set fname=%fname:3=3% set fname=%fname:4=4% set fname=%fname:5=5% set fname=%fname:6=6% set fname=%fname:7=7% set fname=%fname:8=8% set fname=%fname:9=9% set fname=%fname:0=0% ren %1 %fname% ================= 複数のD&Dへの対応、効率化などご教示いただけますと幸いです。

  • 以下のtest.batでtest.txt中のダブルコーテションを削除し

    以下のtest.batでtest.txt中のダブルコーテションを削除したいと考えています。 【test.bat】 @echo off if "%1"=="" goto end set fname=%1 copy %fname% org >nul type nul >%fname% for /f %%a in ( org ) do (set line=%%a&& call :sub) del org goto end :sub set l=%line:"=% echo %l%>>%fname% goto :EOF :end 【test.txt】 "test1",101,1 "test2",201,2 "test3",301,3 dos窓からtest.bat test.txtを実行し、test.txt の内容を確認すると、 test1,101, という結果になります。 なぜ、最後の数字が削除されるのか? 2行目、3行目のデータが無くなるのは? というところがわかりません。 単純にダブルコーテーションを削除するにはどうしたらよいでしょうか? よろしくおねがいします。

  • bat について

    @echo on for %%F in ( D:\1\*.xls ) do call :sub "%%F" %%~tF exit /b :sub if not %2==%date% goto :EOF copy /d /y "%~f1" D:\2 goto :EOF 上記は1のフォルダのxlsの最新のファイルを2のフォルダにコピー ですが1のフォルダの中に1Fを含むファイル(20120915-1F) この1Fを含むファイルで最新のファイルだけを2のフォルダにコピーしたいのです。 どうか宜しくお願い致します。

  • バッチファイルでの%を含むファイル名の取得

    以下はEドライブを走査してフォルダごとのjpgやpngなどのファイルの数を全て表示するバッチ処理ですが。基本的に上手く動きますが%を含むファイル名、フォルダ名に当たると上手く動きません。どうしたらいいでしょうか?”ファイル名、フォルダ名に%を使うな”という回答以外でお願いします。 @echo off pushd E:\ for /f "delims=" %%j in ('dir /b /s /a:d') do call :sub "%%j" exit /b :sub echo /////////////////////////////////////////////////////////////////////////// for /f "delims=" %%x in ('dir /b %1 ^| find /c ".jpg"') do call :jpg %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".JPG"') do call :jpg2 %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".png"') do call :png %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".bmp"') do call :bmp %%x echo %1 echo jpg %jpg_c% echo png %png_c% echo bmp %bmp_c% echo JPG %jpg2_c% goto :EOF :jpg set jpg_c=%1 :echo %1 goto:EOF :jpg2 set jpg2_c=%1 :echo %1 goto:EOF :png set png_c=%1 :echo %1 goto:EOF :bmp set bmp_c=%1 :echo %1 goto:EOF :all set all_c=%1 :echo %1 goto:EOF

  • DOSのバッチファイルについての質問です。

    DOSのバッチファイルについての質問です。 フォルダ内のファイルネームを一括変更したいと考えています。 変更したい文字がたくさんあり、その都度インプットして処理したいと思い 下記のようなバッチを組んだのですが上手く動きません。 何かいい方法があればご教授下さい。よろしくお願いします。 echo off SET /P word= for %%a in (*%word%*) do call :sub "%%a" exit /b :sub set fname=%~1 set fname=%fname:%woad%=ああ% ren %1 "%fname%" goto :EOF

  • (バッチ処理) リストファイル取得と実行

    お世話になります --ここから-- cls @echo off set $aaaa=0 set $BBBB=0 echo AAAAを読む?(Yes:1 No:0) set /P $aaaa= ^>^> echo BBBBを読む?(Yes:1 No:0) set /P $bbbb= ^>^> if /i 0 EQU %$aaaa% goto next1 start /wait "AAAA BOT" "c:\prog\p.exe" -w AAAA :next1 if /i 0 EQU %$bbbb% goto next2 start /wait "BBBB BOT" "c:\prog\p.exe" -w BBBB :next2 end --ここまで-- 今までは、上記の追記・変更で対処できましたが、 数が多くなり対処しきれなくなってきたので リスト化したtxt(リストファイル.txt)を読み込み、 リストに載っている物を順次処理を行おうと考えております。 -リストファイル.txt- AAAA BBBB CCCC DDDD ---------------- ループさせたりして管理の簡素化を図りたいと思っています どのように記述を行えばよいか教えていただけませんでしょうか よろしくお願いいたします。

  • コマンドプロンプトで.batファイルを作っています。

    古いバックアップディレクトリを削除するバッチファイルを作りたいです。 cd /d e:\fileDir REM:【最終のディレクトリを削除】 for /F %F in ('dir /b /o:-d') do set fname=%F rmdir /s /q %fname%  をコマンドプロンプト画面に貼り付ければ上手く動作しますが*.batと名前を付けて保存したものをダブルクリックでは全く動作しません。  コマンドプロンプト上で実行するのとバッチファイルで実行することの違いについて調べてみましたがなかなか動作するものになりません。  どなたかご教示いただけないでしょうか    

  • 全てのフォルダから最新ファイルを残し削除

    WindowsServer2008にて、 バックアップフォルダを定期的にリフレッシュ (最新以外を削除)するバッチを作りたいです。 CやVBなど、While文、関数のある言語でのプログラム経験がありますが バッチの方は不案内です。何卒ご教授くださいませ。 [処理内容] C:\testdir の配下に、サブフォルダdir1,dir2,dir3が存在します。 C:\testdir にバッチファイル、「dalete.bat」を配置。 実行するのはこの「dalete.bat」になります。 サブフォルダ dir1,dir2,dir3 の中のファイルは、 「no0.zip」,「no1.zip」,「no2.zip」と、規則的な名前です。 残したいのは「no0.zip」,「no1.zip」,「no2.zip」のうち、最新のファイル1個のみです。 [コード1] 次のようなプログラムを書きました。 まずは[dir1]フォルダのみの、 最新ファイル以外を削除するプログラムです。 ------------------------------------------ set L_FILE=C:\testdir\Delete.log echo %DATE% %TIME:~0,8% 処理開始 >> %L_FILE% REM 1フォルダ処理 cd dir1 REM 最新ファイルをリネーム保護 for /f "delims=" %%a in ('dir /b /o:d /a:-d') do set fname=%%a echo "%fname%" をリネーム保存 >> %L_FILE% copy "%fname%" "LASTFILE.zip" REM 他のファイルを削除 del "no*.zip" >> %L_FILE% REM リネーム保護を戻す ren "LASTFILE.zip" "%fname%" echo %DATE% %TIME:~0,8% 処理完了 >> %L_FILE% ------------------------------------------ 結果ログ 2013/11/29 2:17:15 処理開始 "no0.zip" をリネーム保存 2013/11/29 2:17:15 処理完了 ------------------------------------------ フォルダ[dir1]の中身は"no0.zip"のみで、期待した動きです。 [コード2] 次に、[dir1],[dir2],[dir3]全てのフォルダに対し、 最新以外のファイルを削除するコードを、以下のように書きました。 ------------------------------------------ set L_FILE=C:\testdir\Delete_all2.log echo %DATE% %TIME:~0,8% 処理開始 >> %L_FILE% REM フォルダ全てを処理 for /D %%i in (C:\testdir\*) do ( echo %%i フォルダ処理開始 >> %L_FILE% cd %%i REM 最新ファイルをリネーム保護(★) for /f "delims=" %%a in ('dir /b /o:d /a:-d') do set fname=%%a echo "%fname%" をリネーム保存 >> %L_FILE% copy "%fname%" "LASTFILE.zip" REM 他のファイルを削除 del "no*.zip" >> %L_FILE% REM リネーム保護を戻す ren "LASTFILE.zip" "%fname%" ) echo %DATE% %TIME:~0,8% 処理完了 >> %L_FILE% ------------------------------------------ 結果ログ 2013/11/29 2:22:03 処理開始 C:\testdir\dir1 フォルダ処理開始 "" をリネーム保存 C:\testdir\dir2 フォルダ処理開始 "" をリネーム保存 C:\testdir\dir3 フォルダ処理開始 "" をリネーム保存 2013/11/29 2:22:03 処理完了 ------------------------------------------ コード1で、動作確認が取れたコードですが、 ★部で、最新ファイルの取得に失敗しています。 結果、削除処理のみ期待通りに処理されサブフォルダ内の 全ファイルが削除されています。 どうすれば、全フォルダ、最新のみを残しループさせる事が出来るのでしょうか。 どうかお助けください。

専門家に質問してみよう