既定のファイルを選択して、サブフォルダつくってコピーするバッチ。


以下の仕様でバッチファイルを作りたいです。
※とりあえず100pにしていますが出来栄えが良ければ対価積み増しします。


1)バッチファイルと同じフォルダにある既定のファイルをファイル名で指定して、別フォルダを生成してコピーする。
→対象file名は、拡張子含めて固定。バッチ内に直書きで可。ただし複数指定できること。(3~10個程度あればOK)

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2020/06/05 23:56:53
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:gm91

質問者から

GM912020/06/06 14:32:30

その他、補足です。

2)生成する別フォルダは、0000から連番にする。既存の番号から+1する。

3)生成する別フォルダは、バッチファイルがあるフォルダからの相対的位置を決め打ちとする。

例:

 ルートフォルダ-コピー元フォルダ ←ここにバッチを置く。

        |

        -OUTPUT-0000 ←バッチ実行ごとに連番で生成される。

            -0001

            -0002

            -0003

              :

4)OSはWin10とする。

5)Win10に、プラグインとかランタイム類をインストールせずに使えること。

6)Excel等を起動する必要ないこと。

※その他不明点あればコメントにてお願いします。

ベストアンサー

id:siachan No.1

回答回数91ベストアンサー獲得回数23

ポイント255pt

 こんな感じでどうでしょうか。とりあえず 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 ファイルを使用する方法もありますし。

※無駄にループを回していて遅くなっていたので修正しました。

id:gm91

試してみました。ほぼイメージ通りの動作になります。アレンジもしやすいので大変助かります。ありがとうございました!

2020/06/05 23:55:31

その他の回答0件)

id:siachan No.1

回答回数91ベストアンサー獲得回数23ここでベストアンサー

ポイント255pt

 こんな感じでどうでしょうか。とりあえず 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 ファイルを使用する方法もありますし。

※無駄にループを回していて遅くなっていたので修正しました。

id:gm91

試してみました。ほぼイメージ通りの動作になります。アレンジもしやすいので大変助かります。ありがとうございました!

2020/06/05 23:55:31

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません