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

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

ただいまの
回答率

90.52%

  • Windows

    1439questions

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

  • for

    226questions

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

  • バッチファイル

    223questions

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

バッチファイル効率化

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 252

pipi

score 145

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

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\
~~以下同じ


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 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_仕事関係\
    が違いますね。
    書いた通りに、
    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 編集

    > %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 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 で参照します。

    キャンセル

0

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Windows

    1439questions

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

  • for

    226questions

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

  • バッチファイル

    223questions

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