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

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

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

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

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

バッチファイル

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

Q&A

解決済

1回答

10336閲覧

bat処理でファイルの最終更新日時から5分経過したファイルをコピーしたい

den_den

総合スコア1

Windows

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

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

バッチファイル

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

0グッド

0クリップ

投稿2021/04/13 17:18

前提・実現したいこと

OS:windows2012R2
サービスaを実行すると「C:\temp\log」配下に「A_YYYYMMDD_?.log」ファイルが生成されます。
※基本的に1ファイルですが、複数作成される場合が有ります。

サービスが起動すると同時に「C:\temp\log」配下に「A_YYYMMDD_?.log」が作成され、ログ出力が開始されます。
ログの出力処理が終わっても、サービスは自動で停止しない為、ファイルの最終更新時間から5分経過した事を判定し「\NAS\log」配下に当日生成した全ての「A_YYYMMDD_?.log」ファイルをコピーするbatを作成したいです。

以下のフローを想定して作成しています
①当日の「A_YYYMMDD_?.log」ファイルのタイムスタンプを抜き出す。
②「A_YYYMMDD_?.log」ファイルの最終更新時間が5分経過している事を判定
③経過していない場合は②へ。経過した場合は④へ。
④当日の「A_YYYMMDD_?.log」全ファイルをNASにコピーする。

①~③の処理構想が出来なく、困っております。ご助力をお願い致します。

発生している問題・エラーメッセージ

最終更新時間から5分経過したファイルの判定方法処理が自身の能力不足により、作る事が出来ませんでした。
フォルダの構成は以下の様なイメージです。

C:\temp\log
A_20210412_0.log
A_20210412_1.log
A_20210412_2.log

該当のソースコード

①当日ファイルのタイムスタンプを抜き出す。
)案1
forfiles /d %DATE%' -c "cmd /c echo @ftime"

②ファイルの最終更新時間から5分経過している事を判定
③経過していない場合は②へ。経過した場合は④へ
→②③構想が出来なくコードの作成が出来ておりません。

④当日の「A_YYYYMMDD_?.log」全ファイルをNASにコピーする。
FOR /F %i in ('forfiles /d %DATE%') do copy /Y %i \NAS\log

試したこと

ネット上で過去の事例など検索しましたが、近しい事象が確認できず、こちらに記載させて頂きました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

gentaro

2021/04/13 18:39

基本的にWindowsのバッチで簡単にできるのはテキストベースの処理なので、時間計算など複雑な処理が必要なのであればPowerShell等を使うべきでしょう。 さもなければ、テキストで書かれた時間を比較して差分を計算する、というロジックをイチから自分で作るか、それをやってくれる何らかの外部コマンド類を用意するところから始める必要があります。
den_den

2021/04/20 03:34

テキストベースならバッチ処理、計算などはpowershellとの概念が無かった為、この様な質問をしてしまいました。 申し訳ございません。 ご指摘有り難う御座います
guest

回答1

0

ベストアンサー

バッチスクリプトだけで書くのは不可能では無いですが、面倒くさいです。

(1) 当日ファイルのタイムスタンプを抜き出す。
for %%A in (A_20210412_0.log) do set TIME_OF_A=%%~tA
で、2021/01/01 12:13のような形式で得られます。
ここまでは面倒では無いですが。

(2) ファイルの最終更新時間から5分経過している事を判定

CMD

1for /f "tokens=1-5 delims=/: " %%A in ("%TIME_OF_A%") do set /a Y=%%A,MO=1%%B-100,D=1%%C-100,H=1%%D-100,MI=1%%E-100

のようにして、得たタイムスタンプを、年、月、日、時、分に分解します。
(0で始まる数字は8進数とみなすという余計な機能があるので、先頭に1を追加してそれを回避します)

あとは、分から時への繰り上がりなどを考慮して、5分後の日時を計算します。
小学校の算数レベルなので難しくは無いですが、2/28 23:59の5分後だと閏年の計算もいるので、ひたすら面倒くさいです。

(3) 経過していない場合は(2)へ。経過した場合は(4)へ
(2)で求めた日時と、現在時刻を比較します。

CMD

1set TIME_PLUS_5MIN=~~~~~ 2 3:XX 4set NOW_DATE=%DATE% 5rem 0時~9時台は先頭が空白なので0にする 6set NOW_TIME=%TIME: =0% 7rem 時分だけを取り出す 8set NOW_TIME=%NOW_TIME:~0,5% 9rem そうこうしているうちに日付が変わったらやり直し 10if "%NOW_DATE%" NEQ "%DATE%" goto XX 11rem 現在時刻が小さければ2へ 12if "%NOW_DATE% %NOW_TIME%" LSS "%TIME_PLUS_5MIN%" goto L2

実用的には、PowerShell か、VBScript+WSHか、あるいは、全体はバッチスクリプトで日時の計算だけVBSCriptでとか。

投稿2021/04/14 12:42

otn

総合スコア85766

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

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

den_den

2021/04/19 17:47

お返事が遅くなってしまい、申し訳ございません。 回答有難う御座います。 知識不足とはいえ、面倒な質問をしてしまい申し訳ございませんでした。 特に日付の分解部分は全く考え付きもしない内容で凄く勉強になりました。 頂いた回答を元に、処理を考えてみます。 時刻を求める部分は下記のサイトを参考にしてみるつもりです <https://golorih.exblog.jp/14108251/> ご回答して頂き、有難う御座います。
den_den

2021/04/20 03:25

OTNさん コードを教授して頂き、有り難う御座いました。 頂いたコードを元に、下記bat処理を作ったところ、やりたい事が出来るようになりました。 知恵を貸して頂き感謝致します。本当にありがとうございます。 ---------- cd C:\temp\log :L2 for %%A in (YYYYMMDD_?.log) do set TIME_OF_A=%%~tA set DATE_OF_A=%TIME_OF_A:~0,10% set TIME_OF_A=%TIME_OF_A:~11,5% set argv1=%TIME_OF_A% set argv2=5 set /a MINUTE=%argv1:~-2,2% set /a HOUR=%argv1::=%/100 set /a MINTOTAL=HOUR*60+MINUTE+argv2 if %MINTOTAL% LSS 0 set /a MINTOTAL+=((-MINTOTAL/1440+1)*1440) set /a MINTOTAL%%=1440 set /a HOUR=MINTOTAL / 60 set /a MINUTE=MINTOTAL %% 60 if %MINUTE% LSS 10 set MINUTE=0%MINUTE% if %HOUR% LSS 10 set HOUR=0%HOUR% set TIME_PLUS_5MIN=%HOUR%:%MINUTE% :XX set NOW_DATE=%DATE% set NOW_TIME=%TIME: =0% set NOW_TIME=%NOW_TIME:~0,5% if "%NOW_DATE%" NEQ "%DATE%" goto XX if "%NOW_DATE% %NOW_TIME%" LSS "%DATE_OF_A% %TIME_PLUS_5MIN%" goto L2 echo この後コピー処理になる。 ---------- 以上、宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問