D:\Work\temp\内に1M、5M、10Mのファイルがあり、
ファイル毎のコピー時間を計測するバッチを作りたいのです。
一応、下記のバッチで変数path_1の1M-file.datのところを一回一回書き換えれば
できますが、もっと効率よくループを使って書けないものでしょうか?
コピーに要する時間の計測については、単純ですが、開始時刻と終了時刻を
ログに記述し、後ほど、終了時刻-開始時刻で自分で求めます。
@echo off
rem 変数セット
set path_1=D:\Work\temp\1M-file.dat
set path_2=\\192.168.1.1\testdir\
set Log_paht=\\192.168.1.1\logs\
set Log_filename=copy-
rem 開始時刻設定
set S_date_tmp=%date:/=%
set S_time_tmp=%time: =0%
set yyyy=%S_date_tmp:~0,4%
set yy=%S_date_tmp:~2,2%
set mm=%S_date_tmp:~4,2%
set dd=%S_date_tmp:~6,2%
set hh=%S_time_tmp:~0,2%
set mi=%S_time_tmp:~3,2%
set ss=%S_time_tmp:~6,2%
set sss=%S_time_tmp:~9,2%
set S_datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%
rem ログ・ファイル作成。ファイル名にタイムスタンプ(開始時刻付与)
echo Start-Time %S_datetime% > %Log_path%%Log_filename%-%S_datetime%.log
rem コピー開始
copy %path_1% %path_2% >> %Log_path%%Log_filename%-%S_datetime%.log
echo コピー中
rem 終了時刻設定
set E_date_tmp=%date:/=%
set E_time_tmp=%time: =0%
set yyyy=%E_date_tmp:~0,4%
set yy=%E_date_tmp:~2,2%
set mm=%E_date_tmp:~4,2%
set dd=%E_date_tmp:~6,2%
set hh=%E_time_tmp:~0,2%
set mi=%E_time_tmp:~3,2%
set ss=%E_time_tmp:~6,2%
set sss=%E_time_tmp:~9,2%
set E_datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%
rem 終了時刻をログ・ファイルに追記
echo End-Time %E_datetime% >> %Log_path%%Log_filename%-%E_datetime%.log
宜しくお願い致します。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
@echo off
for %%F in (1M-file.dat 5M-file.dat 10M-file.dat) do call :SUB %%F
goto :EOF
:SUB
rem 変数セット
set path_1=D:\Work\temp\%1
set path_2=\\192.168.1.1\testdir\
~~以下同じ
ログファイルに>
している部分は、>>
に変更してください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
for %%i in (D:\Work\temp\*-file.dat) do (
rem 処理
echo ファイル名=%%i
)
とすれば、D:\Work\temp\にある*-file.datを列挙しますので
使えるかと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.98%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/05/13 16:05 編集
@echo off
cd C:\work\02_仕事関係\
for %%i in (01-1M.dat 02-5M.dat 03-10M.dat 04-1G.dat) do call :SUB %%i
goto :EDF
:SUB
rem 変数セット
set path_1=C:\work\02_仕事関係\
set path_2=C:\work\10-test\
set Log_paht=C:\work\10-test\
rem 開始時刻設定
set S_date_tmp=%date:/=%
set S_time_tmp=%time: =0%
set yyyy=%S_date_tmp:~0,4%
set yy=%S_date_tmp:~2,2%
set mm=%S_date_tmp:~4,2%
set dd=%S_date_tmp:~6,2%
set hh=%S_time_tmp:~0,2%
set mi=%S_time_tmp:~3,2%
set ss=%S_time_tmp:~6,2%
set sss=%S_time_tmp:~9,2%
set S_datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%
echo %i > %Log_path%copy-%i-%S_datetime%.log
echo StartTime %S_datetime% >> %Log_path%copy-%i-%S_datetime%.log
rem コピー開始
copy %path_1% %path_2% >> %Log_path%copy-%i-%S_datetime%.log
echo %%iコピー中
rem 終了時刻設定
set E_date_tmp=%date:/=%
set E_time_tmp=%time: =0%
set yyyy=%E_date_tmp:~0,4%
set yy=%E_date_tmp:~2,2%
set mm=%E_date_tmp:~4,2%
set dd=%E_date_tmp:~6,2%
set hh=%E_time_tmp:~0,2%
set mi=%E_time_tmp:~3,2%
set ss=%E_time_tmp:~6,2%
set sss=%E_time_tmp:~9,2%
set E_datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%
echo EndTime %E_datetime% >> %Log_path%copy-%i-%S_datetime%.log
timeout /T 2
)
2018/05/13 16:09
が違いますね。
書いた通りに、
set path_1=C:\work\02_仕事関係\%1
としてください。
ログに書くところの > も >> に。
2018/05/13 17:28
なぜ、set path_1=C:\work\02_仕事関係\%1とするのでしょうか?%1を記載する理由が分かりません。
ログの出力先をset Log_paht=C:\work\10-test\で指定しているにも関わらず、なぜか
C:\work\02_仕事関係\のフォルダに作成されてしまいます。
ログのファイル名を、copy-01-1M.dat-開始時刻.logにしようとしているのですが、
copy--20180513172108.logとなってしまいます。
@echo off
cd C:\work\02_仕事関係\
for %%i in (01-1M.dat 02-5M.dat 03-10M.dat 04-1G.dat) do call :SUB %%i
goto :EDF
:SUB
rem 変数セット
set path_1=C:\work\02_仕事関係\%1
set path_2=C:\work\10-test\
set Log_paht=C:\work\10-test\
rem 開始時刻設定
set S_date_tmp=%date:/=%
set S_time_tmp=%time: =0%
set yyyy=%S_date_tmp:~0,4%
set yy=%S_date_tmp:~2,2%
set mm=%S_date_tmp:~4,2%
set dd=%S_date_tmp:~6,2%
set hh=%S_time_tmp:~0,2%
set mi=%S_time_tmp:~3,2%
set ss=%S_time_tmp:~6,2%
set sss=%S_time_tmp:~9,2%
set S_datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%
echo %i% >> %Log_path%copy-%i%-%S_datetime%.log
echo StartTime %S_datetime% >> %Log_path%copy-%i%-%S_datetime%.log
rem コピー開始
copy %path_1% %path_2% >> %Log_path%copy-%i%-%S_datetime%.log
echo %%iコピー中
rem 終了時刻設定
set E_date_tmp=%date:/=%
set E_time_tmp=%time: =0%
set yyyy=%E_date_tmp:~0,4%
set yy=%E_date_tmp:~2,2%
set mm=%E_date_tmp:~4,2%
set dd=%E_date_tmp:~6,2%
set hh=%E_time_tmp:~0,2%
set mi=%E_time_tmp:~3,2%
set ss=%E_time_tmp:~6,2%
set sss=%E_time_tmp:~9,2%
set E_datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%
echo EndTime %E_datetime% >> %Log_path%copy-%i-%S_datetime%.log
timeout /T 2
)
2018/05/13 20:09 編集
01-1M.dat などのファイル名を指定するためです。そもそもバッチファイルに於ける %1 の意味がわからないということでしょうか?
> ログの出力先をset Log_paht=C:\work\10-test\で指定しているにも関わらず、なぜか
C:\work\02_仕事関係\のフォルダに作成されてしまいます。
Log_paht と Log_path とで名前が違っています。
初心者の「うまくいかない」は80%くらいがタイプミスです。
> ログのファイル名を、copy-01-1M.dat-開始時刻.logにしようとしているのですが、
copy--20180513172108.logとなってしまいます。
%i% が未定義です。ファイル名なら、%1 です。
2018/05/14 23:40
%1には、01-1M.dat、02-5M.datという引数が順番に代入されてくるという認識でよろしいでしょうか?
>%i% が未定義です。ファイル名なら、%1 です。
%1に直してみましたが、やはり結果は、copy--20180513172108.logと同じ状態です。
copy-01-1M.dat-20180513172108.logとはならないですね・・・。
作成されたログファイルを見てみると以下のように出力されています。
---
ECHO は <OFF> です。
StartTime 20180514233215
1 個のファイルをコピーしました。
EndTime 20180514233215
---
ECHO は <OFF> です。・・・やはり%1が何かオカシイようです。。。
@echo off
cd C:\work\02_仕事関係\
for %%i in (01-1M.dat 02-5M.dat 03-10M.dat 04-1G.dat) do call :SUB %%i
goto :EOF
:SUB
rem 変数セット
set path_1=C:\work\02_仕事関係\%1
set path_2=C:\work\10-test\
set Log_paht=C:\work\10-test\
rem 開始時刻設定
set S_date_tmp=%date:/=%
set S_time_tmp=%time: =0%
set yyyy=%S_date_tmp:~0,4%
set yy=%S_date_tmp:~2,2%
set mm=%S_date_tmp:~4,2%
set dd=%S_date_tmp:~6,2%
set hh=%S_time_tmp:~0,2%
set mi=%S_time_tmp:~3,2%
set ss=%S_time_tmp:~6,2%
set sss=%S_time_tmp:~9,2%
set S_datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%
echo %i% >> %Log_path%copy-%i%-%S_datetime%.log
echo StartTime %S_datetime% >> %Log_path%copy-%i%-%S_datetime%.log
rem コピー開始
copy %path_1% %path_2% >> %Log_path%copy-%i%-%S_datetime%.log
echo %i%コピー中
rem 終了時刻設定
set E_date_tmp=%date:/=%
set E_time_tmp=%time: =0%
set yyyy=%E_date_tmp:~0,4%
set yy=%E_date_tmp:~2,2%
set mm=%E_date_tmp:~4,2%
set dd=%E_date_tmp:~6,2%
set hh=%E_time_tmp:~0,2%
set mi=%E_time_tmp:~3,2%
set ss=%E_time_tmp:~6,2%
set sss=%E_time_tmp:~9,2%
set E_datetime=%yyyy%%mm%%dd%%hh%%mi%%ss%
echo EndTime %E_datetime% >> %Log_path%copy-%i%-%S_datetime%.log
timeout /T 2
)
2018/05/15 11:25
%1は、引数です。
call :SUB %%i で:SUBを呼び出したときに、呼び出し側の %%i を呼び出され側では %1 で参照します。