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

このQ&Aのポイント
  • バッチファイルを使用して、複数のフォルダ内に格納されている.txtファイルのファイル名を、現在のフォルダ名に置き換えて別のフォルダに格納する方法を教えてください。
  • for文を使用して、データ取得元のフォルダを一つずつ処理し、その中にあるフォルダを再帰的に処理していく方法で実装します。
  • 各フォルダ内の.txtファイルのファイル名に現在のフォルダ名を連結して、別のフォルダに格納します。ファイルの中身はそのままコピーされます。
回答を見る
  • ベストアンサー

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

こんにちは。超初心者なのですが教えてください。 ある複数フォルダに格納されている.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? ) ) 申し訳ありませんが、お助け願います。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

rem 対象ファイルの一覧作成 dir /s /b C:\temp > file.tmp rem それに対して繰り返し for /f "delims=" %%F in (file.tmp) do ( rem パス名の分解(ディレクトリ名の取り出し) for /f "delims=\ tokens=3" %%D in ("%%F") do ( rem コピー(ファイル名%%Fの途中に%%Dを入れる) copy %%F C:\test\%%~nF_%%D%%~xF )) del file.tmp

curryteam
質問者

お礼

ご回答の結果をbatファイルにコピーして実行したら、ちゃんと出来ていました。すごいです! ありがとうございましたー。 もう1点お聞きしたいのですが、 こちらのローカルPCの実際のフォルダ構成は日付の下に 曜日が入っていて、下記のようになっています。 C:\temp\20100101\Mon\data1.txt C:\temp\20100101\Mon\data2.txt C:\temp\20100101\Mon\data3.txt これを C:\test\data1_20100101_Mon.txt C:\test\data2_20100101_Mon.txt C:\test\data3_20100101_Mon.txt のようにするには、 for文をもう一個加えればよいのでしょうか。 何もわかってなく申し訳ありませんが、よろしくお願いいたします。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.2

>C:\temp\20100101\Mon\data1.txt "delims=\ tokens=3" で、\ で分解した3つめを取っていますので、4つめも取るようにします。 tokens=3,4 にすると %%D = 20100101, %%E = Mon になります。 dir /s /b C:\temp > file.tmp for /f "delims=" %%F in (file.tmp) do ( for /f "delims=\ tokens=3,4" %%D in ("%%F") do ( copy %%F C:\test\%%~nF_%%D_%%E%%~xF )) del file.tmp

curryteam
質問者

お礼

正しく実行することができました。 ありがとうございました。

関連する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 どうもうまくいきません。。。

  • ファイルのバッチ処理について

    バッチ処理を勉強しているところです。 ひとつの問題が解決できていないので、わかるひとは教えて もらえませんか? C:\bom.txtがあって、C:\temp\a.txtとC:\temp\d.txt, C:\temp\a\a.txt と C:¥temp\b\e.txtもあります。 for でC:\bom.txtファイルとほかのファイルと再帰的に結合して、 ファイル名はそのままにしたいですが、 @set bomfilepath=C:\ 考えているバッチは以下のようになるが、失敗しました。 for /R %1 %%f in (*.*) do @( @rem echo %%f call copy /B %bomfilepath%bom.txt+%%f %%ftemp call del /Q %%f ren %%ftemp %%f ) 原因はどこですか?

  • 【バッチファイル】for繰り返しがうまくいかない

    バッチファイルの置いてあるフォルダ内(ついでにサブフォルダ内も)の 特定の拡張子(今回は.txt)ファイル全てを対象に (1)ある行ある列n文字目から2文字を読み込む×2 (2)読み込んだ文字をそのファイル名の先頭に追加 というバッチファイルを作りたいです。 具体例 テキストの中身↓ a.txt ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○xx ○○yy ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... →ファイル名を「xxyya.txt」にしたい そこで素人ながら下記のようなバッチファイルを作成してみましたが、 フォルダ内にある1つ目のファイルに対してはうまく動くのですが 2つ目以降はリネーム出来ません。 フォルダ内すべての.txtファイルに実行するための 対処法がお分かりになれば、ご教授いただけると幸いです。 「rename.bat」 cd /d %~dp0 rem .txtファイルを列挙 for /f "usebackq tokens=*" %%i in (`dir /s /b *.txt`) do ( set name=%%~xni rem 特定の行列の文字列を抜き出して変数へ格納 for /f "skip=5 tokens=2,3" %%a in (%%i) do ( set front=%%a set back=%%b rem 7行目以降は不要なのでforから離脱 goto break ) :break rem 抜き出した文字列からさらに必要な文字を抜き出して変数へ set hed="%front:~2,2%%back:~2,2%" rem 元のファイル名へ追記 ren %name% %hed%%name% )

  • バッチファイル 文字列操作のやり方

    お世話になります。 バッチファイルのコマンドについてですが、 for文の中で 一番下の階層のファイル名の先頭5バイトが "abcde"のものだけ処理対象にしたいと考えています。 例えば、 C:\tempに以下のファイルがあったら C:\temp\abcdefg.txt    ・・・(1) C:\temp\xxxxxxx.txt    ・・・(2) C:\temp\abcde.txt    ・・・(3) C:\temp\abc.txt    ・・・(4) C:\temp\abcdezzzz.txt    ・・・(5) (1)、(3)、(5)だけを処理させたいと考えています。 実装方法として、以下を考えましたがうまくいきません。 dir /s /b /a-d C\Temp > file.txt for /f "delims=" %%F in (file.txt) do ( set A=%%~nF% if "%%A:~0,5%"=="abcde" ( <処理コマンド> ) ) おそらくfor文の中で何個も命令を記述できないということと、 パラメータ修飾子の指定が間違っているからだと思われますが、 うまくできない理由を知りたいです。 よろしくお願いいたします。

  • 月末日のフォルダを自動作成したい

    batファイルで以下のような処理をしたいのですが上手くいきません。 どなたかご存知でしたらご教授いただきたく・・・ --------------------------------------------------------------------- (1)フラグファイル名によってフォルダを自動生成する  例)   (1)*_25.txtというファイルがあったら、当月25日のフォルダを作成する    →c:\temp\20110425 (2) *_31.txtと言うファイルがあったら、前月末日のフォルダを作成する    →c:\temp\20110331 (2)上記(1)で作成したフォルダの下にファイルの接頭子によってサブディレクトリを作成する  例)   01_*.txtというファイルがあったら   →c:\temp\20110331\01 と作成したい ※上記をsetコマンドを用いて作成してみたのですが、  (1)-(2)の場合にどうしても上手く動きません。  以下、作成してみた駄文:  set zyy=%date:~0,4%  set zmm=%date:~5,2%  rem set zmm=01  set zdd=%date:~8,2%  rem Dフォルダにあるフラグファイルでフォルダを作成  if exist d:\temp\test01\*_05.txt set zfld=%zyy%%zmm%05  if exist d:\temp\test01\*_10.txt set zfld=%zyy%%zmm%10  if exist d:\temp\test01\*_15.txt set zfld=%zyy%%zmm%15  if exist d:\temp\test01\*_20.txt set zfld=%zyy%%zmm%20  if exist d:\temp\test01\*_25.txt set zfld=%zyy%%zmm%25  if exist d:\temp\test01\*_31.txt set/a zmm2=%zmm%-1  if exist d:\temp\test01\*_31.txt ( if %zmm2% equ 0 set zyy2=%zyy% )  if exist d:\temp\test01\*_31.txt ( if %zmm2% equ 0 set/a zyy2=%zyy2%-1 )  if exist d:\temp\test01\*_31.txt ( if %zmm2% equ 0 set zfld=%zyy2%1231 )  if exist d:\temp\test01\*_31.txt ( if %zmm2% equ 1 set zfld=%zyy%0131 )  上記のような感じで、12ヶ月分記述(閏年対応はしない)  その後、以下の構文を発行するとエラーとなってしまいます。  remファイル接頭子によって、サブディレクトリ作成  if exist d:\temp\test01\01*.txt md d:\temp\test01\%zfld%\01 ※ここで『サブディレクトリまたはファイル\01は既に存在します』とエラーになります。   (恐らく、set/aを使っているがため?)   大変お手数ですが、誰かお助け下さい。 以上よろしくお願い致します

  • バッチファイルで条件によって書き出さないようにしたい

    temp.txtというファイルのカンマ4つめが同じだったらテキストに出力しないバッチファイルを作りたいと思っています。 set sbuf=test for /f "tokens=4 delims=, " %%a in (C:temp.txt) do ( set saddress=%%a if %sbuf% == %%a ( ) else ( set saddress=%%a findstr %saddress% C:\sip_cmail\ping_sip.txt >> C:\out.txt ) set sbuf=%%a ) と書いてみたのですが、動きません。 流れとしては、一巡目に通ったときの値をbufにいれておいて、二順目通ったときに比べ、同じだったら何もしないで次に行く、としたいのですが、、 括弧が何十にもなると出来ないのでしょうか。 よろしくお願い致します。

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

     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文を使ってファイルサイズをMbyteで表したい。

    バッチファイルのfor文を使ってファイルサイズをMbyteで表したい。(WindowsXP) for文を使って、フォルダー内のファイル名とサイズ一覧を作ろうとしています。 1)for %%i in (c:\test\*.*) do echo %%i %%~zi>> c:\test\testfiles.txt で一応はできたのですが、これではファイルサイズがわかりにくいので、メガバイト単位にしたいのです。(だいたいわかればいいので1024で割るとかはしない) 2)for %%i in (c:\test\*.*) do echo %%i %%~zi/1000000>> c:\test\testfiles.txt 3)for %%i in (c:\test\*.*) do set /a x=%%~zi/1000000 & echo %%i %%x>> c:\test\testfiles.txt としてもうまくいきません。 %%~ziが数値でなく文字列のため、だと思うのですが、3)は%の付け方とかも間違ってそう。 どう書けばメガバイト単位で一覧を出せるでしょうか? あれ? 4)for %%i in (c:\test\* ) do if %%~zi GEQ 1000000 echo %%i>> c:\test\testfiles.txt とすれば1メガ以上のファイル名一覧が出ますね。 ということは%%~ziは数値なのか。  どなたか、どこが間違っているのか教えていただけないでしょうか

  • 特定のフォルダを除外してバックアップするバッチファイル

    現在、複数のネットワーク共有のバックアップを採るバッチファイル(下記)を使用しております。 以下の書き方ですと、全てのフォルダが採られてしまいます。 特定のフォルダだけ除いてバックアップを取るバッチファイルを作成したいのですが、どのようにすれば宜しいでしょうか? ○サーバ(saruru)の全ての共有フォルダを、自分のPCの「J:\saruru\」以下にバックアップする。 for /f "tokens=1,2" %%A in ('net view \\saruru') do if %%B==Disk xcopy /y /s /i /d \\saruru\%%A J:\saruru\%%A\ >> err.txt rem for /f "tokens=1,2" %%A in ('net view \\saruru') do if %%B==Disk xcopy /c /h /y /k /f /s /i /d \\saruru\%%A I:\saruru\%%A\ >> err.txt もっとベストなスクリプトがありましたら、ご教授お願いいたします。

  • 取得したファイル名から拡張子の削除について

    BATにおいて「C:\test」フォルダに格納されているファイルに対してファイル名を取得後、取得したファイル名から拡張子を削除したファイル名を変数にセットしたいと考えていますが、どのようなロジックにしたらいいかご教示頂けますようお願い致します。 実際のファイルの拡張子は削除せず、表示されたファイル名の拡張子を削除したファイル名を変数にセットしたいと考えています。 ------------------------------------------------------------------------------- set FOLDER=C:\test for /f "usebackq" %%i in (`dir %FOLDER% /B *.txt`) do ( echo %%i pause ) ------------------------------------------------------------------------------- -------------------------------------------------------------------------------- C:\testの中身 a.txt bb.txt ccc.txt dd.txt e.txt -------------------------------------------------------------------------------