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

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

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

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

バッチファイル

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

Q&A

解決済

2回答

4344閲覧

バッチファイル ループ処理について

退会済みユーザー

退会済みユーザー

総合スコア0

Windows

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

バッチファイル

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

0グッド

0クリップ

投稿2018/06/19 23:18

編集2018/06/20 02:24

各ファイルのコピー時間を計測時間をも求めるバッチを作成しているのですが、
なかなかうまく行きません。

<仕様>
C:\work\01_学習資料\01_Windows\bat\tmp
にある01-1G.dat、02-1M.dat、03-5M.datファイルを

C:\work\01_学習資料\01_Windows\bat\tmp1
へ1つ1つコピーしてコピー時間を秒単位で求めます。

bat

1@echo off 2 3set LogPath=C:\work\01_学習資料\01_Windows\bat\tmp\ 4set SrcPath=C:\work\01_学習資料\01_Windows\bat\tmp\ 5set DstPath=C:\work\01_学習資料\01_Windows\bat\tmp1\ 6 7rem 1Gファイルコピー時間計測 8set S_time_tmp=%time: =0% 9set hh=%S_time_tmp:~0,2% 10set mi=%S_time_tmp:~3,2% 11set ss=%S_time_tmp:~6,2% 12set sss=%S_time_tmp:~9,2% 13set S_datetime=%hh%%mi%%ss% 14 15echo 開始:%S_datetime% > %LogPath%01_%S_datetime%.log 16copy %SrcPath%01-1G.dat %DstPath% 17 18rem 終了時刻設定 19set E_time_tmp=%time: =0% 20set hh=%E_time_tmp:~0,2% 21set mi=%E_time_tmp:~3,2% 22set ss=%E_time_tmp:~6,2% 23set sss=%E_time_tmp:~9,2% 24set E_datetime=%hh%%mi%%ss% 25 26echo 終了:%E_datetime% >> %LogPath%01_%S_datetime%.log 27 28timeout 2 > null 29 30 31rem 1Mファイルコピー時間計測 32set S_time_tmp=%time: =0% 33set hh=%S_time_tmp:~0,2% 34set mi=%S_time_tmp:~3,2% 35set ss=%S_time_tmp:~6,2% 36set sss=%S_time_tmp:~9,2% 37set S_datetime=%hh%%mi%%ss% 38 39echo 開始:%S_datetime% > %LogPath%02_%S_datetime%.log 40copy %SrcPath%02-1M.dat %DstPath% 41 42rem 終了時刻設定 43set E_time_tmp=%time: =0% 44set hh=%E_time_tmp:~0,2% 45set mi=%E_time_tmp:~3,2% 46set ss=%E_time_tmp:~6,2% 47set sss=%E_time_tmp:~9,2% 48set E_datetime=%hh%%mi%%ss% 49 50echo 終了:%E_datetime% >> %LogPath%02_%S_datetime%.log 51 52timeout 2 > null 53 54rem 5Mファイルコピー時間計測 55set S_time_tmp=%time: =0% 56set hh=%S_time_tmp:~0,2% 57set mi=%S_time_tmp:~3,2% 58set ss=%S_time_tmp:~6,2% 59set sss=%S_time_tmp:~9,2% 60set S_datetime=%hh%%mi%%ss% 61 62echo 開始:%S_datetime% > %LogPath%03_%S_datetime%.log 63copy %SrcPath%03-5M.dat %DstPath% 64 65rem 終了時刻設定 66set E_time_tmp=%time: =0% 67set hh=%E_time_tmp:~0,2% 68set mi=%E_time_tmp:~3,2% 69set ss=%E_time_tmp:~6,2% 70set sss=%E_time_tmp:~9,2% 71set E_datetime=%hh%%mi%%ss% 72 73echo 終了:%E_datetime% >> %LogPath%03_%S_datetime%.log 74

上記コードでは、100ファイルあったっら非常に非効率になってしまうことは重々承知です。
ループを使ってなんとしたいのですが・・・・

一応、一つ一つ分解し簡略化した動作を確認しています。
まずは、コピー元フォルダ内のファイルが取得できるか確認。↓

@echo off cd C:\work\01_学習資料\01_Windows\bat\tmp for %%i in (*.dat) do ( echo %%i )

そして、以下のようにループで取得したファイル名をパスに連結すると
エラーとなってしまいます。%%1には、ファイル名が入っているので、

copy %SrcPath%%%i % DstPath%

としても大丈夫なような気もするのですが・・・・

@echo off set LogPath=C:\work\01_学習資料\01_Windows\bat\tmp\ set SrcPath=C:\work\01_学習資料\01_Windows\bat\tmp\ set DstPath=C:\work\01_学習資料\01_Windows\bat\tmp1\ cd %SrcPath% for %%i in (*.dat) do ( rem echo %%i copy %SrcPath%%%i % DstPath%  ) pause

11:24 追記↓
試行錯誤して下記の様に変更したら、1ファイルずつコピーできるようになりましたが、
logファイルがうまく生成されません。
logファイルは、log-YYYYMMDDSS.logという形式で出力させたいのですが、なぜか、
log-.logというファイルが1ファイルしか出来上がりません。

bat

1@echo off 2 3set LogPath=C:\work\01_学習資料\01_Windows\bat\tmp\ 4set SrcPath=C:\work\01_学習資料\01_Windows\bat\tmp\ 5set DstPath=C:\work\01_学習資料\01_Windows\bat\tmp1\ 6 7cd %SrcPath% 8 9 10for %%i in (*.dat) do ( 11 rem echo %%i 12 13 set S_time_tmp=%time: =0% 14 set hh=%S_time_tmp:~0,2% 15 set mi=%S_time_tmp:~3,2% 16 set ss=%S_time_tmp:~6,2% 17 set S_datetime=%hh%%mi%%ss% 18 19rem logファイル生成 20 echo PC→XXServer > %LogPath%log-%S_datetime%.log 21 echo CopyFileName: %%i >> %LogPath%log-%S_datetime%.log 22 echo 開始時刻:%S_datetime% >> %LogPath%log-%S_datetime%.log 23 24 copy %%i %DstPath% 25 26 set E_time_tmp=%time: =0% 27 set hh=%E_time_tmp:~0,2% 28 set mi=%E_time_tmp:~3,2% 29 set ss=%E_time_tmp:~6,2% 30 set E_datetime=%hh%%mi%%ss% 31 32 echo 終了時刻:%E_datetime% >> %LogPath%log-%S_datetime%.log 33 34 timeout /T 2 > null 35) 36 37pause

アドバイスの程、よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

forの中をサブルーチンにしてください。

DOS

1for %%i in (*.dat) do call :SUB %%i 2pause 3exit /b 4:SUB 5 rem echo %1 6 7 set S_time_tmp=%time: =0% 8 set hh=%S_time_tmp:~0,2% 9 set mi=%S_time_tmp:~3,2% 10 set ss=%S_time_tmp:~6,2% 11 set S_datetime=%hh%%mi%%ss% 12 13rem logファイル生成 14 echo PC→XXServer > %LogPath%log-%S_datetime%.log 15 echo CopyFileName: %1 >> %LogPath%log-%S_datetime%.log 16 echo 開始時刻:%S_datetime% >> %LogPath%log-%S_datetime%.log 17 18 copy %1 %DstPath% 19 20 set E_time_tmp=%time: =0% 21 set hh=%E_time_tmp:~0,2% 22 set mi=%E_time_tmp:~3,2% 23 set ss=%E_time_tmp:~6,2% 24 set E_datetime=%hh%%mi%%ss% 25 26 echo 終了時刻:%E_datetime% >> %LogPath%log-%S_datetime%.log 27 28 timeout /T 2 > null

あと、1つのファイルのコピーが1秒以内で終わると、ログファイル名が重複して上書きされるので、追記にした方が良いと思います。
echo PC→XXServer >> %LogPath%log-%S_datetime%.log

投稿2018/06/20 03:48

otn

総合スコア84555

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

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

0

% DstPath% ```の部分のスペースがおかしいかと

%DstPath%

### 追記 for内の環境変数に関しては「遅延環境変数」について調査されるとよいかと思います。 ただ、そうするよりは、下記のようにfor内を別のバッチファイルとしたほうがすっきりするかと 思います。 バッチ1

set DstPath=C:\dest

for %%i in (.) do (

バッチ2 %%i %DstPath%

)

pause

バッチ2

set LogPath=C:\log\

set S_time_tmp=%time: =0%

copy %1 %2

set E_time_tmp=%time: =0%

投稿2018/06/20 00:32

編集2018/06/20 03:29
YAmaGNZ

総合スコア10258

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問