実現したいこと
各フォルダに存在する複数のcsvファイルを一つのフォルダにまとめたいです
前提
つい先日初めてバッチファイルを触り始めました。
特定のフォルダをbatファイルで実行して複数のcsvファイルを一つのフォルダにまとめたいと思っています。
しかしフォルダ内に存在する全てのcsvファイルは同一名称(ここではdatalist01.csv)になっていて一つのフォルダにまとめようとすると上書きされてしまうため、csvファイルの名前を変更(csvファイルが格納されている子フォルダ名(ここではtest_listA~...2023~...)を各csvファイル名の前半部分に足す)して一つのフォルダにまとめようとしています。
batファイル内で行いたい処理を示しますと以下のようになります。
・カレントフォルダに「test_all」フォルダを生成する
・実行したフォルダが空だった場合終了、それ以外なら次の処理へ
・実行フォルダ内の全てのcsvファイルに対して処理を実行
・各csvファイル名の前半部に各csvファイルが格納されているフォルダ名を付与してコピー
・コピー元は各csvファイルが格納されている各フォルダ、コピー先はtest_allフォルダ
・処理の終了
フォルダ構成を示しますと以下のようにしたいと思っています。
BAT_TEST/(BatファイルおよびCSVファイル群が格納されているフォルダ)
├─bat_test/(Batファイルで処理を行いたいフォルダ)
│ ├─test_listA/
│ │ ├─ test_listA202308/
│ │ │ └─ datalist01.csv
│ │ ├─ test_listA202309/
│ │ │ └─ datalist01.csv
│ │ ├─ test_listA202310/
│ │ │ └─ datalist01.csv
│ │ └─ ...
│ │
│ ├─ test_listB/
│ │ ├─ test_listB202308/
│ │ │ └─ datalist01.csv
│ │ ├─ test_listB202309/
│ │ │ └─ datalist01.csv
│ │ ├─ test_listB202310/
│ │ │ └─ datalist01.csv
│ │ └─ ...
│ └─ ...
└─ test.bat
batファイルで処理後
BAT_TEST/(BatファイルおよびCSVファイル群が格納されているフォルダ)
├─bat_test/(Batファイルで処理を行いたいフォルダ)
│ ├─test_listA/
│ │ ├─ test_listA202308/
│ │ │ └─ datalist01.csv
│ │ ├─ test_listA202309/
│ │ │ └─ datalist01.csv
│ │ ├─ test_listA202310/
│ │ │ └─ datalist01.csv
│ │ └─ ...
│ │
│ ├─ test_listB/
│ │ ├─ test_listB202308/
│ │ │ └─ datalist01.csv
│ │ ├─ test_listB202309/
│ │ │ └─ datalist01.csv
│ │ ├─ test_listB202310/
│ │ │ └─ datalist01.csv
│ │ └─ ...
│ └─ ...
│
├─test_all(Batファイル実行後作成されるフォルダ、および処理したCSVファイルを格納するフォルダ)
│ ├─test_listA/
│ │ ├─ test_listA202308datalist01.csv(名称を変更したtest_listA202308に格納されていたCSVファイル)
│ │ ├─ test_listA202309datalist01.csv(名称を変更したtest_listA202309に格納されていたCSVファイル)
│ │ ├─ test_listA202310datalist01.csv(名称を変更したtest_listA202310に格納されていたCSVファイル)
│ │ └─ ...
│ │
│ ├─ test_listB/
│ │ ├─ test_listB202308datalist01.csv(名称を変更したtest_listB202308に格納されていたCSVファイル)
│ │ ├─ test_listB202309datalist01.csv(名称を変更したtest_listB202309に格納されていたCSVファイル)
│ │ ├─ test_listB202310datalist01.csv(名称を変更したtest_listB202310に格納されていたCSVファイル)
│ │ └─ ...
│ └─ ...
│
└─ test.bat
発生している問題・エラーメッセージ
(※バッチファイルのエラーメッセージをどう出力すればいいのかわかりませんでした...)
・test_allフォルダは生成されるがそれ以降の処理が正常に動作していない、しかし原因がわからない。
・test_allフォルダ内にもcsvファイルが格納されている各フォルダを生成できていない
(上記構成だとtest_all\test_listA,B...←csvがコピーされてきた格納されるこのフォルダ群)
・コピー元やコピー先のパス指定の仕方が理解できておらず、どう記述すればいいかわからない
(copy コピー元 コピー先 名前 とするとみたがパスでの指定がわからない)
・ファイル名の変更がうまくいかない、わからない
=========以下8/14追記===========================
簡易的に作成したフォルダ構成にてバッチファイルを実行するフォルダを指定して処理を行った結果(追記上部コード)正常に動作したが
バッチファイルに対して様々なファイルをドラッグ&ドロップで処理を実行したいため、追記下部コードにてset "TargetFolder=%~dp1"でバッチファイルを実行したフォルダのパスを指定してみたが、12行目までしか正常に動作しませんでした。
19行目、24行目のfor /d %%j in ("%TargetFolder%%%i*")が間違っているのだと思いますが、解決策がわからずじまいになっています。
大変申し訳ないのですが現状の限界を感じております。助力のほどいただけたら幸いです。
該当のソースコード
bat
1@echo off 2 3:rem エラーメッセージ、処理結果の出力は最終的にはしないのでこの部分は消去予定 4mkdir .\log 5set BAT_LOG=%~dp0\log\%bad%.log 6 7mkdir .\test_all 8 9if "%~1"=="" goto usage 10 dir /a:d "%~1">NUL 2>&1 11 if %errorlevel% EQU 0 goto top 12 13 pushd "%~dp1" 14 "%~f0" "%CD%" 15 16:top 17set "pname=%~f1" 18set "name=%~nx1" 19 20for /f "delims=" %%f in ('dir /b "%cfname%"\*.csv') do ( 21 set "cfname=%%~dpf" 22 setlocal enabledelayedexpansion 23 for %%d in ("!cfname:~0,-1!") do ( 24 set "dirname=%%~nd" 25 copy "%pname%\%%f" ".\test_all\!dirname!_%%f" 26 ) 27 endlocal 28) 29 30goto :EOF 31 32:usage 33echo usage: %0 folder or file 34 35Pause 36Exit
=========以下8/14追記===========================
bat
1@echo off 2 3rem Cell_log_allフォルダを生成 4mkdir .\Cell_log_all 5 6rem 各Cell_log(CL-)サブフォルダを生成 7for %%i in (Mt-Log Df-Log Lf-Log Dd-Log) do ( 8 mkdir ".\Cell_log_all\CL-%%i" 9) 10 11setlocal enabledelayedexpansion 12 13rem フォルダ上から下へ 14for %%i in (Mt-Log Df-Log Lf-Log Dd-Log) do ( 15 rem サブフォルダカウント 16 set count=0 17 for /d %%j in ("%Cell_datalist%\%%i*") do ( 18 set /a count+=1 19 ) 20 21 rem サブフォルダ処理 22 for /d %%j in ("%Cell_datalist%\%%i*") do ( 23 set "sourceFolder=%%j" 24 set "destinationFolder=.\Cell_log_all\CL-%%i\%%~nxj" 25 26 rem サブフォルダコピー 27 xcopy /Y /I /E "!sourceFolder!" "!destinationFolder!" 28 ) 29) 30 31rem カレントフォルダCell_log_allフォルダ対象 32set "targetFolder=.\Cell_log_all" 33 34rem CSVファイル処理 35for /r "%targetFolder%" %%i in (*.csv) do ( 36 rem CSVファイルのパスを取得 37 set "csvPath=%%~fi" 38 39 rem フォルダ名変更 40 set "folderName=%%~dpi" 41 set "folderName=!folderName:~0,-1!" 42 43 rem ファイル名連結 CSVファイル移動 44 move /Y "!csvPath!" "!folderName!.csv" >nul 2>&1 45) 46 47rem 各サブフォルダ処理 48for %%i in (CL-Mt-Log CL-Df-Log CL-Lf-Log CL-Dd-Log) do ( 49 rem サブフォルダのパスを設定 50 set "subfolder=.\Cell_log_all\%%i" 51 52 rem 空フォルダ削除 53 for /d %%j in ("!subfolder!\*") do ( 54 rd "%%j" 2>nul 55 ) 56) 57 58endlocal 59 60exit
bat
1@echo off 2 3set "TargetFolder=%~dp1" 4 5rem Cell_log_allフォルダを生成 6mkdir .\Cell_log_all 7 8rem 各Cell_log(CL-)サブフォルダ生成 9for %%i in (Mt-Log Df-Log Lf-Log Dd-Log) do ( 10 mkdir ".\Cell_log_all\CL-%%i" 11) 12 13setlocal enabledelayedexpansion 14 15rem フォルダ上から下へ 16for %%i in (Mt-Log Df-Log Lf-Log Dd-Log) do ( 17 rem サブフォルダカウント 18 set count=0 19 for /d %%j in ("%TargetFolder%\%%i*") do ( 20 set /a count+=1 21 ) 22 23 rem サブフォルダ処理 24 for /d %%j in ("%TargetFolder%\%%i*") do ( 25 set "sourceFolder=%%j" 26 set "destinationFolder=.\Cell_log_all\CL-%%i\%%~nxj" 27 28 rem サブフォルダコピー 29 xcopy /Y /I /E "!sourceFolder!" "!destinationFolder!" 30 ) 31) 32 33rem カレントフォルダCell_log_allフォルダ対象 34set "targetFolder=.\Cell_log_all" 35 36rem CSVファイル処理 37for /r "%targetFolder%" %%i in (*.csv) do ( 38 rem CSVファイルのパスを取得 39 set "csvPath=%%~fi" 40 41 rem フォルダ名変更 42 set "folderName=%%~dpi" 43 set "folderName=!folderName:~0,-1!" 44 45 rem ファイル名連結 CSVファイル移動 46 move /Y "!csvPath!" "!folderName!.csv" >nul 2>&1 47) 48 49rem 各サブフォルダ処理 50for %%i in (CL-Mt-Log CL-Df-Log CL-Lf-Log CL-Dd-Log) do ( 51 rem サブフォルダのパスを設定 52 set "subfolder=.\Cell_log_all\%%i" 53 54 rem 空フォルダ削除 55 for /d %%j in ("!subfolder!\*") do ( 56 rd "%%j" 2>nul 57 ) 58) 59 60endlocal 61 62exit
試したこと
ファイル名を変更する等の単語で調べソースコードをお借りしてきたのち、ren→copy等のいくつかに変更を加えていきました。
各変数やコマンドの意味等を調べて理解を進めていました。
補足情報(FW/ツールのバージョンなど)
使用OS:windows10

回答1件
あなたの回答
tips
プレビュー