バッチファイルでフォルダ名をファイル名に置き換える方法

このQ&Aのポイント
  • バッチファイルを使用して、複数のフォルダに格納されているファイルの名前をフォルダ名にリネームする方法を教えてください。
  • 指定したフォルダ内のファイルを、それぞれのフォルダ名に基づいてリネームするバッチファイルの作成方法を教えてください。
  • バッチファイルを使って、特定のフォルダ内にあるファイルをフォルダ名に基づいてリネームする方法を教えてください。
回答を見る
  • ベストアンサー

バッチファイル フォルダ名をファイル名に置き換える

ある複数フォルダに格納されているファイルを、フォルダ名に リネームするバッチファイルを作成したいです。 ●リネーム前 C:\リネーム\あいうえお\data.txt C:\リネーム\かきくけこ\data.txt C:\リネーム\さしすせそ\data1.txt C:\リネーム\さしすせそ\data2.txt C:\リネーム\たちつてと\data1.log C:\リネーム\たちつてと\data2.log C:\リネーム\なにぬねの\data.log ↓ ●リネーム後 C:\リネーム\あいうえお\あいうえお.txt C:\リネーム\かきくけこ\かきくけこ.txt C:\リネーム\さしすせそ\さしすせそ 1.txt C:\リネーム\さしすせそ\さしすせそ 2.txt C:\リネーム\たちつてと\たちつてと 1.log C:\リネーム\たちつてと\たちつてと 2.log C:\リネーム\なにぬねの\なにぬねの.log 知識がなく申し訳ありませんが、お助け願います。。 pause cd c:\リネーム dir /s /b C:\リネーム\ > file.tmp for /f "delims=" %%F in (file.tmp) do ( for /f "delims=\ tokens=3" %%D in ("%%F") do ( REN %%F C:\リネーム\%%D\%%D%%~xF )) del file.tmp pause どうもうまくいきません。。。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

ざっと書いてみました 例外処理やエラー処理など一切省いていますので 想定外のファイル名などついている場合は、動かないかも 「rename.vbs」という名前で存して、マウスでダブルクリックしてみてください 'ここから myFolder="C:\リネーム\" set fs=CreateObject("Scripting.FileSystemObject") set objFolder=fs.GetFolder(myFolder) Set objRE = CreateObject("VBScript.RegExp") For Each sf in objFolder.SubFolders set objSubFolder=fs.GetFolder(sf) For Each f in objSubFolder.Files fname=fs.GetFileName(f) bname=fs.GetBaseName(f) ext=fs.GetExtensionName(f) pname=fs.GetFileName(fs.GetParentFolderName(f)) objRE.pattern=".*?([\d]*?$)" newname=objRE.replace(bname,pname&"$1") &"."&ext msgbox myFolder&fname&" -> "& myFolder&newname f.Name=newname Next Next 'ここまで

natural_on2004
質問者

お礼

ありがとうございます! 無事動きました!!本当に感謝です><

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ファイル名をディレクトリ名にあわせるならディレクトリ分けする意味がないような・・・ いわゆるbatではなくwsh(vbs)であればもっとやりやすいと思います。 なお、 hoge1.txt fuga1.txt など存在すると競合しますが、絶対にでてこない保証があるという前提でいいのでしょうか?

natural_on2004
質問者

お礼

回答ありがとうございます。 そうなんです、ディレクトリ分けする意味ないんです。。 wshですね、勉強してみます>< 競合するとは、複数のディレクトリ内に同じファイル名が存在するとという意味でしょうか?

関連するQ&A

  • バッチファイル 現在のフォルダ名をファイル名に置き換える

    こんにちは。超初心者なのですが教えてください。 ある複数フォルダに格納されている.txtファイルを、現在の フォルダ名を取得して、別フォルダにリネームして 格納するバッチファイルを作成したいと考えています。 for文を繰り返し使わなければいけないことはわかっているのですが、それをどう表現していいのか全然わかりません。 例えば、 データ取得元として以下のファイルがあったら C:\temp\20100101\data1.txt C:\temp\20100101\data2.txt C:\temp\20100101\data3.txt C:\temp\20100102\data1.txt C:\temp\20100102\data2.txt C:\temp\20100103\data1.txt C:\temp\20100103\data2.txt これを別フォルダに、現在のフォルダ名をファイル名にくっつけて 以下のように一つのフォルダに纏めて格納したいと思っています。 ファイルの中身はそのままコピーしたいので、どこかでcopyコマンド を使うかもしれないです。 C:\test\data1_20100101.txt C:\test\data2_20100101.txt C:\test\data3_20100101.txt C:\test\data1_20100102.txt C:\test\data2_20100102.txt C:\test\data1_20100103.txt C:\test\data2_20100103.txt 実装方法として以下までは考えましたが、これ以上は無理そうです。 rem set A=C:\temp rem set B=C:\test for %%A in (C:\temp\) do ( if not "%%A"=="" ( pushd "%%A" for /d %%B in (*) do ( if not "%%B"=="" ( pushd "%%B" for /d %%C in (*) do ( if not "%%C"=="" ( pushd "%%C" ) ) ) ) popd? ) ) 申し訳ありませんが、お助け願います。

  • コマンドプロンプトでファイル読み込み

    For文を使って、パラメータファイルから値を読み込みたいのですが、 "C:\Documents and Settings\~"等(パスにスペースが含まれる場合)に置かれた場合、 ファイルを読み込んでくれず困っております。 ()内のファイル指定で、""(ダブルクォーテーション) や'(シングルクォーテーション)で囲むこともしてみましたが、ダメでした。。 どう指定すればよいのかご教授下さい。 よろしくお願いいたします。 【パラメータファイル(tmp.txt)】 ABC=12345 【バッチファイル(test.bat)】 for /F "delims== tokens=1,2" %%A in (D:\tmp.txt) do if %%A==ABC set value_1=%%B echo %value_1% pause

  • バッチファイル パス名に( )や!がある場合の対処

    2つのフォルダの配下にあるすべてのファイルが一致していることを確認する 下記のtest.batのプログラムでは、フォルダ名やファイル名の中に、 ()や!が含まれていない時は正しく動作しますが、 含まれていると正しく動作しません。 (問1) パスに( )が含まれている場合 (例)set x=C:\tmp\sample\DATA(1)_SP\   set y=C:\tmp\sample\DATA(2)_SP\ は、 echo !j:%x%=!>> list1.txt の所で 「_SP\ の使い方が誤っています。」 と表示されて正しく動作しませんが どのようにすればよいでしょうか。 (問2) echo !j:%x%=!>> list1.txt を echo !j:!x!=!>> list1.txt にすると、環境変数xの部分が空白に置き換わらないのですが なぜでしょうか。 (問3) パスに!が含まれている場合 (例)DATA1とDATA2の配下に!ABCというフォルダがある場合   C:\tmp\sample\DATA1\!ABC\… は、 for /F "delims=" %%i in (list01.txt) の取り出しの時に!が抜け落ちてしまい 以後の処理が正しく行えません。 !が抜け落ちないようにするには どのようにすればよいでしょうか。 よろしくお願いします。 ---test.bat---------------------------------------------- setlocal enabledelayedexpansion @echo off set x=C:\tmp\sample\DATA1\ set y=C:\tmp\sample\DATA2\ if exist list1.txt del list1.txt if exist list2.txt del list2.txt dir /b /s /a-d %x% > list01.txt dir /b /s /a-d %y% > list02.txt for /F "delims=" %%i in (list01.txt) do ( set j=%%i echo !j:%x%=!>> list1.txt ) for /F "delims=" %%i in (list02.txt) do ( set j=%%i echo !j:%y%=!>> list2.txt ) fc /n /w list1.txt list2.txt > result.txt if ERRORLEVEL 1 ( set /p z="両者は一致しませんでした。" goto :EOF ) else ( if exist result.txt del result.txt ) set cnt=1 set err_cnt=0 for /F "delims=" %%i in (list1.txt) do ( set /p<NUL=[!cnt!] fc /n /w "%x%%%i" "%y%%%i" >> nul if ERRORLEVEL 1 ( echo [!cnt!] %x%%%i >> result.txt fc /n /w "%x%%%i" "%y%%%i" 2>&1 >> result.txt set /a err_cnt=!err_cnt!+1 ) set /a cnt=!cnt!+1 ) echo; if %err_cnt%==0 ( set /p z="両者は完全に一致しました。" ) else ( set /p z="%err_cnt% 個が一致しませんでした。" ) ------------------------------------------------- 【動作環境】Windows7 コマンドプロンプト(Ver.6.1.7601)  

  • バッチファイル 2ファイルをfor /f処理したい

    バッチファイルで別の2つのファイルを読み込んでfor /f処理するには 変換前のファイルのファイル名と 変換後のファイルのファイル名が それぞれ別のファイルに書かれていて この2つのファイルを読み込んで リネームするバッチファイルを 記述したいのですが 2つのfor /fを使った場合、 一方が他方にネストされてしまうのですが このような場合は どのように記述するのでしょうか。 例えば、 変換前のファイル名が書かれたファイル(s.txt)と 変換後のファイル名が書かれたファイル(d.txt) がある場合、 abc.txtをqrs.txt d f.txtをtuw.txt ghi.txtをx z.txt  : にリネームしたいのですが もちろんtest1.batではうまくいきません。 ---test1.bat------------------- for /f %%a in (s.txt) do for /f %%b in (d.txt) do ren "%%a" "%%b" ------------------------------ ---s.txt---------------------- abc.txt d f.txt ghi.txt : ---d.txt---------------------- qrs.txt tuw.txt x z.txt : ------------------------------ 以下の sd.txt のように1つのファイルにして test2.bat のようにすればできますが s.txt と d.txt の2つのファイルのままで処理するには どのように記述すればよいのでしょうか。 ---test2.bat------------------- for /f "tokens=1,2 delims=," %%a in (sd.txt) do ren "%%a" "%%b" ---sd.txt---------------------- abc.txt,qrs.txt d f.txt,tuw.txt ghi.txt,x z.txt : ------------------------------- よろしくお願いします。(Windows7)

  • バッチでファイルの読み込み

    Windowsバッチでファイルの読み込みをしようと思っているのですが、 下記コマンドの実行で「ファイルが見つかりません」となります。 ※パスにスペースを含むのでusebackqを使用しました。 FOR /F "usebackq tokens=1,2 delims= " %%i in ("c:\temp 1\data.txt") DO echo %%i WindowsServer2003でうまくいかなかったのですが、 Xpですれば問題なくファイルを読み込めました。 何か差があるのでしょうか?

  • バッチファイル内置換

    バッチファイルで、置換をしたいのですが、"="と"<"の置換が出来ません。 ping出力を「file.txt」へ保存し、保存した「file.txt」を一行づつ読み出し下記を実行しています。 for /f "delims=" %%a in ( orig ) do ( set line=%%a call :sub ) :sub set tmp=%line% set tmp=%tmp:<=,% set tmp=%tmp:= =,,% set tmp=%tmp:"時間" =,% set tmp=%tmp:ms=,ms% echo %tmp%>>%CSV_Name% goto :EOF :end 置換出来ないのは、"=" と "<"の文字だけが置換出来ません。 ネットで調べたのですが、"^" でエスケープしても、""二重引用部でくくっても、正しく置換でき有ません。

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

    以下は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

  • バッチファイルで2行にわたるコマンドを入力したいのですが

    バッチファイルで複数行にわたるコマンドを打ちたいのですが、方法がわからなくて困っています。 for /f "tokens=1,2,3 delims=/ " %%a in ('date /t') do ( set hinichi=%%a%%b ) "C:\Program Files\Lhaca\Lhaca.exe" "test%hinichi%01.txt" "test%hinichi%02.txt" ・・・・・・・ と31個のファイルを圧縮するバッチです。 体裁の問題ですが、 for /f "tokens=1,2,3 delims=/ " %%a in ('date /t') do ( set hinichi=%%a%%b ) "C:\Program Files\Lhaca\Lhaca.exe" ? "test%hinichi%01.txt" ? "test%hinichi%02.txt" ・・・ としたいのですが各行のつなぎの記号?がわかりません。 ご存知の方、よろしくお願いいたします。

  • バッチファイルで、ファイル名から自動振分したい

     C:\B\の中に、必ず「半角数字4桁_」から始まるファイル名のデータが毎週入ります。  「半角数字4桁_」以後のファイル名、拡張子は、その週によって変わります。  C:\A\の中には、必ず「_半角数字4桁_」で終わるフォルダ名のサブフォルダがあります。  このフォルダ名は、ずっと変わることがありません。  C:\B\の中にあるデータを、ファイル名の最初の4桁の数字をもとに、C:\A\にあるサブフォルダに自動で移動したいです。また、移動する際に、既にサブフォルダ内に「半角数字4桁_」から始まるファイル名のデータがある場合は、削除してから移動したいです。 フォルダ構成です。 Cー|    |-【A】    |   |-【あいう_1234】    |  |-【あい_2235】    |   |-【かきくけ_8990】    |   |-【アイウエオ_5014】    |    |-【B】    |   |-1234_ABC.txt    ←このファイルは C:\A\【あいう_1234】に。    |  |-2235_1534.txt   ←このファイルは C:\A\【あい_2235】に。    |   |-8990_22.doc     ←このファイルは C:\A\【かきくけ_8990】に。    |   |-5014_わをん.doc   ←このファイルは C:\A\【アイウエオ_5014】に。   自分でバッチファイルを記述してみたのですが、ここからどうしていいか分かりません。  どなたか教えてもらえないでしょうか? よろしくお願いします。    自分で記述してみたバッチファイルです。 cd C:\B dir /b > C:\C\list.txt set folder=C:\A set file=C:\B set Bat=C:\C for /f "delims=" %%a in ( %Bat%\list.txt ) do if exist "%file%\%%a" move "%folder%\%%a" "%to%" PAUSE > NUL

  • バッチファイル(for文)がうまく動かない

    以下のようなバッチファイルをWin2008上で実行しようとしています ------------------------------ @echo on set LOGFILE=C:\a.log set CONF=C:\a.txt FOR /F "tokens=1-3 delims=," %%i in (%CONF%) do ( echo %%i %%j %%k > %LOGFILE% 2>&1 ) ------------------------------ C:\a.txtの中身はこのようになっています ------------------------------ a,b,c e,f,g ------------------------------ 期待する結果は「1.」なのですが.batを実行しても「2.」の結果がログに表示されます どのように修正すれば期待の結果が得られますでしょうか ※ちなみに.batの実行ではなくコマンドプロンプトで[%%]を[%]に変更すれば正常に実行できました 1. ------------------------------ a b c e f g ------------------------------ 2. ------------------------------ e f g ------------------------------

専門家に質問してみよう