以下の仕様でバッチファイルを作りたいです。
※とりあえず100pにしていますが出来栄えが良ければ対価積み増しします。
1)バッチファイルと同じフォルダにある既定のファイルをファイル名で指定して、別フォルダを生成してコピーする。
→対象file名は、拡張子含めて固定。バッチ内に直書きで可。ただし複数指定できること。(3~10個程度あればOK)
その他、補足です。
2)生成する別フォルダは、0000から連番にする。既存の番号から+1する。
3)生成する別フォルダは、バッチファイルがあるフォルダからの相対的位置を決め打ちとする。
例:
ルートフォルダ-コピー元フォルダ ←ここにバッチを置く。
|
-OUTPUT-0000 ←バッチ実行ごとに連番で生成される。
-0001
-0002
-0003
:
4)OSはWin10とする。
5)Win10に、プラグインとかランタイム類をインストールせずに使えること。
6)Excel等を起動する必要ないこと。
※その他不明点あればコメントにてお願いします。
こんな感じでどうでしょうか。とりあえず TARGET の指定さえすれば、質問の例にあるように動作するはずなんですが。
@echo off setlocal enabledelayedexpansion rem ====================================== rem = コピーするファイル名群 rem ====================================== set TARGET1=file1.txt set TARGET2=file2.txt set TARGET3=file3.txt set TARGET4=file4.txt set TARGET5=file5.txt set TARGET6=file6.txt set TARGET7=file7.txt set TARGET8=file8.txt set TARGET9=file9.txt set TARGET10=file10.txt rem ====================================== rem = 上記TARGETxの最大数 rem ====================================== set MAXFILES=10 rem ====================================== rem = 作成するフォルダの固定名 rem ====================================== set PREFIX=OUTPUT- rem ====================================== rem = 連番の桁数 rem ====================================== set COLUMNS=4 rem ====================================== rem = コピー元ファイルが存在するフォルダ名 rem ====================================== set FROM=. rem ====================================== rem = コピー先フォルダを作成するフォルダ名 rem ====================================== set DEST=..\ rem ====================================== rem = ROBOCOPY に指定するスイッチ rem ====================================== set ROBO=/R:0 /W:0 /LOG:log.txt /TEE rem ====================================== set MAXFOLDERS= set PADDING= for /L %%N in (1,1,%COLUMNS%) do ( set MAXFOLDERS=!MAXFOLDERS!9 set PADDING=!PADDING!0 ) set N=0 :LP set F=%PADDING%%N% set FOLDER=%DEST%%PREFIX%!F:~-%COLUMNS%! rem echo %FOLDER% if not exist "%FOLDER%" goto OK set /A N=N+1 if %N% LEQ %MAXFOLDERS% goto LP echo フォルダの最大数に到達しました rem pause exit /b 1 :OK md "%FOLDER%" set COPYCMD=robocopy %ROBO% "%FROM%" "%FOLDER%" for /L %%I in (1,1,%MAXFILES%) do ( if not "!TARGET%%I!"=="" set COPYCMD=!COPYCMD! "!TARGET%%I!" ) rem echo %COPYCMD% %COPYCMD% endlocal if errorlevel 8 ( for /F %%E in ('cmd/k prompt $E^<NUL') do echo %%E[101m!!!!!!!!! ROBOCOPY でエラーが発生しました !!!!!!!!!%%E[0m rem pause exit /b 2 ) exit /b 0
一応 MAXFILES でファイル数の上限を指定するようにしていますが、その番号の TARGET が指定されていなければ無視するだけなので、上限より少なかったり飛び飛びだったりしても問題ありません。
注意点としては、コマンドラインにファイル名をずらずら並べるようになっているため、あまり長いファイル名が多いとすべてのファイルを処理できないことがあります。
とはいっても、半角英数で最大8192文字ということなので、10ファイル程度では問題にならないでしょう。その時は JOB ファイルを使用する方法もありますし。
※無駄にループを回していて遅くなっていたので修正しました。
こんな感じでどうでしょうか。とりあえず TARGET の指定さえすれば、質問の例にあるように動作するはずなんですが。
@echo off setlocal enabledelayedexpansion rem ====================================== rem = コピーするファイル名群 rem ====================================== set TARGET1=file1.txt set TARGET2=file2.txt set TARGET3=file3.txt set TARGET4=file4.txt set TARGET5=file5.txt set TARGET6=file6.txt set TARGET7=file7.txt set TARGET8=file8.txt set TARGET9=file9.txt set TARGET10=file10.txt rem ====================================== rem = 上記TARGETxの最大数 rem ====================================== set MAXFILES=10 rem ====================================== rem = 作成するフォルダの固定名 rem ====================================== set PREFIX=OUTPUT- rem ====================================== rem = 連番の桁数 rem ====================================== set COLUMNS=4 rem ====================================== rem = コピー元ファイルが存在するフォルダ名 rem ====================================== set FROM=. rem ====================================== rem = コピー先フォルダを作成するフォルダ名 rem ====================================== set DEST=..\ rem ====================================== rem = ROBOCOPY に指定するスイッチ rem ====================================== set ROBO=/R:0 /W:0 /LOG:log.txt /TEE rem ====================================== set MAXFOLDERS= set PADDING= for /L %%N in (1,1,%COLUMNS%) do ( set MAXFOLDERS=!MAXFOLDERS!9 set PADDING=!PADDING!0 ) set N=0 :LP set F=%PADDING%%N% set FOLDER=%DEST%%PREFIX%!F:~-%COLUMNS%! rem echo %FOLDER% if not exist "%FOLDER%" goto OK set /A N=N+1 if %N% LEQ %MAXFOLDERS% goto LP echo フォルダの最大数に到達しました rem pause exit /b 1 :OK md "%FOLDER%" set COPYCMD=robocopy %ROBO% "%FROM%" "%FOLDER%" for /L %%I in (1,1,%MAXFILES%) do ( if not "!TARGET%%I!"=="" set COPYCMD=!COPYCMD! "!TARGET%%I!" ) rem echo %COPYCMD% %COPYCMD% endlocal if errorlevel 8 ( for /F %%E in ('cmd/k prompt $E^<NUL') do echo %%E[101m!!!!!!!!! ROBOCOPY でエラーが発生しました !!!!!!!!!%%E[0m rem pause exit /b 2 ) exit /b 0
一応 MAXFILES でファイル数の上限を指定するようにしていますが、その番号の TARGET が指定されていなければ無視するだけなので、上限より少なかったり飛び飛びだったりしても問題ありません。
注意点としては、コマンドラインにファイル名をずらずら並べるようになっているため、あまり長いファイル名が多いとすべてのファイルを処理できないことがあります。
とはいっても、半角英数で最大8192文字ということなので、10ファイル程度では問題にならないでしょう。その時は JOB ファイルを使用する方法もありますし。
※無駄にループを回していて遅くなっていたので修正しました。
試してみました。ほぼイメージ通りの動作になります。アレンジもしやすいので大変助かります。ありがとうございました!
試してみました。ほぼイメージ通りの動作になります。アレンジもしやすいので大変助かります。ありがとうございました!
2020/06/05 23:55:31