DOS バッチ コマンド ファイル読み込みから複数コピーでディレクトリもつくる

DOS バッチ コマンド ループ 変数 ファイル読み込みから複数コピーでディレクトリもつくる

DOSコマンドプロンプトなんて使わないと思ってましたが、
フォルダが増えるとファイルエクスプローラーでいちいちフォルダをクリックして更にクリックしてなんて面倒くさい。
しかもオリジナルファイルをバックアップして、リネームするのが面倒くさい。
そんなときに、コマンドプロンプトは便利です。
explorer .とすると現在のディレクトリのファイルエクスプローラーを起動できます。
explorer ディレクトリ でそのディレクトリのファイルエクスプローラーを起動できます。

このDOSバッチファイルは
テキストファイルに記載されたファイルをコピーします。
コピー先にディレクトリが無いときは作成してコピーします。

使い方は
リスト.csvに
A_DIR¥A.txt B_DIR¥B.txt
のように、スペースで空けて二列をつくります。
A.txtがコピー元
B.txtの列がコピー先になります。
B_DIRが存在しないときは作成します。
また、コピー元が存在しないときは、コピーしません。
ループの中の変数の扱いが少し厄介です。

コマンドプロンプトでバッチ名を入力してリターンをすると
リストのCSVのパスとファイル名が表示されてポーズ状態になります。
このリスト名が正しければどれかキーを入力します。
するとコピーが始まります。
コピー元が存在しないときはコピーしません。
そして、コピー先のディレクトリが存在しないときはディレクトリを作ります。入れ子になっていても作ります。
そして、コピーした数とリストの数を出力しますので、いくつコピーが成功したかわかります。

・解説
ループ内の変数の扱いは右辺を「!」で囲む。左辺はそのまま。

@echo off
REM 遅延関数
setlocal enabledelayedexpansion
rem 読み込むファイル ここにdir_a\a.txt dir_b\b.txtとスペース区切りで記載
set FILE_PATH=C:\Users\maseda\Documents\作業中2\リスト.csv

echo バックアップコピーしますがよろしいですか?
echo %FILE_PATH%のリストからコピーします
rem ポーズでもし間違ったリストを指定しないかを確認。キーを押すとコピを開始
pause
rem コピーした数を表示する変数、初期値は0
set icount=0

rem リストの数(CSVに記載したコピーの数を表示する変数、初期値は0)
set iallcount=0

rem 2行スキップして読み込み開始するときは "SKIP=2 TOKENS=1,2" 1,2は列の番号。3つ列があれば、123となる
for /f "TOKENS=1,2" %%a in (%FILE_PATH%) do (
    rem 行毎の処理を記述。カラムの値は %%a, %%b, %%c,%%dとアルファベット順。
  rem変数に入れるけど今は使ってない
    set ORGFILE=%%a
    set COPYFILE=%%b
    rem echo !ORGFILE! これでファイルの中身がでる
	if exist %%a (
		rem パスを確認して、フォルダが存在しなければ作成 ループの外に書くときは引数%FILE_PATH%として記載する
		call :CHECK_FOLDER_EXIST %%b
		copy %%a %%b 
		echo %%a コピーしました。
		rem /a がないとだめ。右辺は「!」で囲むが左辺はない /aは計算オプションらしい
         rem /aがないとそのまま表示するらしい(試してない)
		SET /a icount=!icount!+1
	) else (
		echo "Xファイルがありませんでした" %%a
	)
	SET /a iallcount=!iallcount!+1
)
echo %iallcount% リストの数
echo %icount% コピーしました。
rem exit /bがないと下の関数を実行してしまう。
exit /b


:CHECK_FOLDER_EXIST
if not exist "%~dp1" (
 	echo "ディレクトリを作成"
    mkdir "%~dp1"
 )
goto :EOF


:END
echo end

こちらの記事もどうぞ