Skip to content

Instantly share code, notes, and snippets.

@iranika
Last active March 30, 2019 12:32
Show Gist options
  • Save iranika/2f7a1a25165def020a1355fee6052ae5 to your computer and use it in GitHub Desktop.
Save iranika/2f7a1a25165def020a1355fee6052ae5 to your computer and use it in GitHub Desktop.
PowerShellで定期実行っぽいことをしてみる。

Check-PDF.ps1について

interval_timeだけスリープして、フォルダ内のファイル監視を行うスクリプト。

注記:

  • エラーが起こっても気にせず処理を継続するので注意。
  • スクリプトが落ちた場合が考慮されていないので注意。

Timer.ps1について

Timer.ps1は定期実行検証のサンプル。 Timer.ps1はN秒sleepして、ExecProc関数を実行する。 デバッグ用のExecProcで実行時刻をStampSheet.datに記録するようになっている。

注記: N秒スリープ→実行したい処理→N秒スリープ→実行したい処理→… という流れで処理するため、厳密にはN秒間隔で定期実行するわけではい。 StampSheet.datに記録されている実行時刻を見ればよく分かる。

以下の環境で動作確認。

PS: [Monit] > $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.17134.590
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.17134.590
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
<#
スクリプトの引数の設定。
./Check-PDF.ps1 -interval_time 10
みたいに引数から指定もできます
#>
param(
[int]$interval_time = 5 #デフォルトで5秒
)
#エラーが起こった際にスクリプトを止めるかどうか
$ErrorActionPreference = "Continue"
#監視対象のフォルダ
$DIRS=@(
"./sampleDir",
"C:\sampleDir"
)
#ループ処理
$is_loop = $true
while ($is_loop) {
#interval_time秒だけスリープ
Start-Sleep -Seconds $interval_time
#実行したい処理を実行
foreach($dir in $DIRS){
$result = (dir $dir/*.pdf)
if ($result.Length -ne 0){ #上の処理でヒットした数が0以外=ps1がN個ある
#pdfがある時の処理を書く
#下記のように再生したいメディアのフルパスを書くと既定のアプリで再生することもできます
#C:\Windows\Media\Alerm01.wav
}else{
#pdfがないときの処理を書く
}
}
}
function Timer{
<#
.SYNOPSIS
interval_time秒だけスリープしてExecProcを実行する関数
.DESCRIPTION
interval_time秒だけスリープしてExecProcを実行する関数
#>
param(
# Parameter help description
[Parameter(Mandatory)][int]$interval_time
)
while ($true) {
#interval_time秒だけスリープ
Start-Sleep -Seconds $interval_time
#実行したい処理を実行
ExecProc
}
}
function ExecProc {
<#
.SYNOPSIS
実行したい処理のダミー関数(デバッグ用)
.DESCRIPTION
実行したい処理のダミー関数(デバッグ用)
関数やexeの実行呼び出しにも時間がかかるため、それの計測用のために
StampSheet.datに時刻を出力する
#>
#もし実行したい処理の時刻計測がしたい場合は、ここで処理の呼び出しを行う
#notepad.exe #実行例
#実行時刻のスタンプ(実行間隔の精度デバッグ用)
Get-Date -Format "yyyy/MM/dd hh:mm:ss:ff" >> ./StampSheet.dat
cls ; cat ./StampSheet.dat
}
#エントリーポイント(ここからはじまる)
#3秒間隔で実行
echo "" > ./StampSheet.dat #デバッグ用の実行時刻記録ファイルの初期化(デバッグ不要なら消す)
Timer 3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment