sleep を使う

丸パクで参考にさせていただきましたー!
PowerShellでwatch相当の処理を行う

処理概要

主目的の処理
・他のサーバー上の "task1.log" という名前のログファイルを、ローカルディスクにコピーする。
・ファイル名の末尾に日付を追加してリネームする。
・24時間(24×60×60 = 86400 秒)ごとに、上記処理を繰り返し実行する。

その他の処理
・コピーを開始する前に現在日時をログ(cp-24h-interval.log)に出力する。
・コピーしたログファイルから日時が含まれる行を抽出して別ファイル($date.txt)に出力する。

    while ($true -eq $true) {  
    get-date >> cp-24h-interval.log ;  
    $date = get-date -format yyyyMMdd ;  
    cp \\servername\Dir1\task1.log C:\Users\username\Documents\Dir1\task1_$date.log ;  
    cat task1_$date.log | select-string "2018" > C:\Users\username\Documents\Dir1\$date.txt ;  
    sleep -s 86400 ;  
    clear }  

背景

とあるサーバー上で日次で実行される処理の動向を2週間ほど観測したい。必要な情報はログに出力されるので、ログを回収すれば済むのだけど、そのログは常に同じファイル名で毎回実行するたびに上書きされてしまう。
そのため毎日回収する必要がある(というか、そもそもログの出力処理を改修したい)のだけど、サーバー上でスクリプトの改修や追加を行うには面倒な申請が必要。
そこで申請不要でスクリプトを実行できる踏み台サーバーのほうににお目当てのサーバーからログを取ってくるスクリプトを日次で実行させることにしたが、タスクスケジューラの使用が禁止されていた。ローカルグループポリシーで。なにそのxxx
というわけで、タスクスケジューラ以外の方法で24時間ごとにログをコピーできる方法を考えてみた。

実行してみます

いったん 'sleep -s 600' (10分)で試行したところ問題なく動いてくれている。
24時間周期のスクリプトも今日から実行して2-3日様子を見た後、うまくいっていれば週末のログも回収できてうれしい。
㍉Sec とか 秒 の単位で使う前提のものなので、24時間とか大きい間隔でも大丈夫なものかしら…

3日後

ちゃんと24時間ごとにコピーとテキスト出力ができているみたい。いいぞ。

数日程度ならこのやり方で何とかなりそう。

2週間後

”p-24h-interval.log” の記録を見ると、2週間後もほぼ遅延なく実行でいていて、今回の「定期的に別サーバーからログ(テキストファイル)を取得する」という用途には十分に事足りました。
目的の処理(今回はcp)を実行後にスリープ時間をカウントするので、毎回の処理時間が長い場合はその分日々の再開時刻が遅くなるため、毎回の処理時間が長くても数秒程度の場合か、開始時間のズレが許容できる期間内に終了できる場合にのみ、使ってみるのがよさそうです。

2018年12月4日 20:00:23
2018年12月5日 20:00:24
2018年12月6日 20:00:24
2018年12月7日 20:00:25
2018年12月8日 20:00:25
2018年12月9日 20:00:25
2018年12月10日 20:00:29
2018年12月11日 20:00:29
2018年12月12日 20:00:29
2018年12月13日 20:00:29
2018年12月14日 20:00:29
2018年12月15日 20:00:29
2018年12月16日 20:00:30

その他参考