質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

2回答

1942閲覧

バッチファイル効率化

退会済みユーザー

退会済みユーザー

総合スコア0

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2018/05/13 04:30

編集2018/05/13 04:32

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

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

DOS

1@echo off 2 3for %%F in (1M-file.dat 5M-file.dat 10M-file.dat) do call :SUB %%F 4goto :EOF 5 6:SUB 7rem 変数セット 8set path_1=D:\Work\temp\%1 9set path_2=\192.168.1.1\testdir\ 10~~以下同じ

ログファイルに>している部分は、>>に変更してください。

投稿2018/05/13 04:43

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/13 07:09 編集

以下のようにしてみましたが・・・ログが生成されず、コピーも一気に実行されているようです。。。。 @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 )
otn

2018/05/13 07:09

set path_1=C:\work\02_仕事関係\ が違いますね。 書いた通りに、 set path_1=C:\work\02_仕事関係\%1 としてください。 ログに書くところの > も >> に。
退会済みユーザー

退会済みユーザー

2018/05/13 08: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 )
otn

2018/05/13 11:11 編集

> %1を記載する理由が分かりません。 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 14: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 )
otn

2018/05/15 02:25

↑修正前の物のようですが? %1は、引数です。 call :SUB %%i で:SUBを呼び出したときに、呼び出し側の %%i を呼び出され側では %1 で参照します。
guest

0

for %%i in (D:\Work\temp*-file.dat) do ( rem 処理 echo ファイル名=%%i )

とすれば、D:\Work\temp\にある*-file.datを列挙しますので
使えるかと思います。

投稿2018/05/13 04:43

YAmaGNZ

総合スコア10258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問