タスクスケジューラ」タグアーカイブ

【コードサンプル】ネット転送量モニタ

ネットワーク転送量モニタのScript例

hh55_network_transfer.ps1

  • hh55_xxxなので、heartbeat.ps1が直接起動する
  • 毎時55分になると実行する。hh30にすると毎時30分になるし、hh70 にすると実行されることはなくなる。
  • 毎時15分、毎時45分に同じタスクを追加したければ、このScriptファイルをCOPYしてファイル名を hh15_network_transfer.ps1 、hh45_network_transfer.ps1 に変更すればいい
  • ネットワークアダプタが複数ある場合、下記サンプルのように、モニタするネットワークアダプタを絞りこむこともできる
  • 履歴ファイルをCSVファイル形式にしているので、Excel等他のアプリで容易に読み込み可能。
# 定数定義
Set-Variable -Name 'NetTransHist' -Value history\dd9999_network_transfer_history.txt
Set-Variable -Name 'NetAdapterName' -Value "イーサネット"
# ネットの容量を確認する
$now = Get-Date -Format G
$rcv = (get-netadapterStatistics -Name $NetAdapterName).ReceivedBytes
$snd = (get-netadapterStatistics -Name $NetAdapterName).SentBytes
echo "$now,$rcv,$snd" | Out-File -FilePath $NetTransHist -Append

関連する記事・ページ

自宅PCをスマホでリモート管理(タスク管理編)
PCをリモート管理する1手法
【コードサンプル】Windowsタスクへの登録例
【コードサンプル】heartbeat.ps1 – 心音確認 PowerShell Script
【コードサンプル】1時間タスクのScript例
【コードサンプル】24時間タスクのScript例
【コードサンプル】hbJob.bat – Windows Bat Script
【コードサンプル】プロセスモニタのScript例
【コードサンプル】IFTTT経由でLINE通知するScript例
【コードサンプル】ネット転送量モニタ

【コードサンプル】プロセスモニタのScript例

プロセスモニタのScript例

hh30_monitor_process_ME.ps1

  • モニタの場合比較的短い周期(5分や10分)でScriptタスクを起動する必要があるので、メインの処理は hh99_xxxに置いて、修正時のインパクトが少なくなるようにしている
#$scriptName = $myInvocation.MyCommand.name
#************************************************************************************
# 定数定義
#************************************************************************************
Set-Variable -Name 'trigCommand' -Value <IFTTTのEventName>
#************************************************************************************
# メイン処理
#************************************************************************************
.\hh99_monitor_process.ps1 hh99_monitor_process_ME.ps1 mediaespresso PC_A

hh99_monitor_process.ps1

  • ファイルに保存しておいた前回モニタ時のCPU時間を取得して、現在のCPU時間を比較する。差が2秒以内なら「停止状態」としている
#
# プロセスが起動していてCPUを消費しているか監視(モニタ)する
#
#************************************************************************************
# パラメータ定義
#************************************************************************************
Param(
    [parameter(Mandatory=$True)][string]$ScriptName,
    [parameter(Mandatory=$True)][string]$ProcessName,
    [parameter(Mandatory=$True)][string]$MachineName
)
#************************************************************************************
# 定数定義
#************************************************************************************
if ((Get-Variable  -ErrorAction silentlyContinue -Name 'trigCommand' | Measure-Object).count -eq 0){
Set-Variable -Name 'trigCommand' -Value <IFTTTのEventName>
}
#************************************************************************************
# 関数定義
#************************************************************************************
#************************************************************************************
# メイン処理
#************************************************************************************
$vFile =$ScriptName.Replace(".ps1",".txt")
echo "$vFile at $(Get-Date -Format G)"

$cnt = (get-process -ErrorAction SilentlyContinue $ProcessName | Measure-Object).count

if($cnt -eq 0){
# プロセスが見つからない
    $now = Get-Date
    echo "プロセスが起動していません at $now"
    exit
}
#echo ProcessName &"(" & pID &")"

Get-Content $vFile | Foreach-Object{
   $var = $_.Split('=')
   Set-Variable -Name $var[0] -Value $var[1]
}

echo "CPU:$cpu"

$cpuAfter = 0
((Get-Process -ErrorAction SilentlyContinue $ProcessName).CPU | ForEach-Object { $cpuAfter = $cpuAfter + $_})
$cpuAfter = [int]$cpuAfter

echo "CPUAFTER:$cpuAfter"

# フラグファイルを生成するだけにする(IFFFへMAKERイベント発火)
if ($cpu -gt $cpuAfter){ # 初期化する
    echo "CPU=$cpuAfter" | Out-File -FilePath $vFile
}else{
    if ($cpu -gt ($cpuAfter - 2)){ # 誤差があるので2とした
        .\hh99_IFTTT_trig.ps1 $trigCommand "アイドル状態($MachineName)"
    }else{
        echo "CPU=$cpuAfter" | Out-File -FilePath $vFile
    }
    echo "CPU=$cpuAfter" | Out-File -FilePath $vFile
}

【コードサンプル】heartbeat.ps1 – 心音確認 PowerShell Script

準備

  • dropboxと組み合わせて、リモートPCを管理したければ、dropboxに専用フォルダを作成して、その直下に以下のScriptを heartbeat.ps1 というファイル名で作成する
    • 自宅PCの場合でも、スマホからも管理したければ、やはりdropboxと組み合わせて運用することを勧める
  • 拡張子ps1の実行には、設定変更が必要(後述)
  • heartbeat.ps1 ファイルを作成したフォルダに、必ず空の(0バイトの) reboot.lock を作成しておく。そうしておかないと、上記スクリプト起動時にPCが強制再起動される

powershell(PS) Script例

#
# 心音確認 PowerShell Script
#
#echo "this is the heartbeat powershell script for ${Env:Computername}"
#
# lockファイル(reboot.lock)が無ければ実行する
$rbLock = "reboot.lock"
If(!(test-path $rbLock)){
    # lockファイルを作成する
    New-Item -ItemType File -Force -Path $rbLock
    Restart-Computer -Force
    Exit
}
#************************************************************************************
# 定数定義
#************************************************************************************
Set-Variable -Name 'SchedTaskHist' -Value "history\dd9999_scheduled_task_history.txt"
Set-Variable -Name 'SshProcessName' -Value ssh
#************************************************************************************
# 関数
#************************************************************************************
Function getHourMin([int]$h,[int]$m){
    $strM = [string]
    $strH = [string]
    if ($m -lt 10){
        $strM = "0" + [string]$m
    }else{
        $strM = [string]$m
    }
    if ($h -lt 10){
        $strH = "0" + [string]$h
    }else{
        $strH = [string]$h
    }
    return $strH + $strM
}
#
# スケジュールタスクを実行する
# 1時間タスク
# lockファイル(cronHH.lock)が無ければ実行する
$cronHHLock = "cronHH.lock"
If(!(test-path $cronHHLock)){
#echo "1時間タスクをチェックして起動する"  | Out-File $OutputLog -append
    Get-Item * -include hh*.ps1 | ForEach-Object {
        $min01 = $_.Name.substring(2,2)
        $min02 = (get-date).Minute
        if($min02 -eq $_.Name.substring(2,2)){
            echo (Get-Date -Format G) $_.Name | Out-File $SchedTaskHist -append
            Invoke-Expression $_
        }
    }
    # lockファイルを作成する
#    New-Item -ItemType File -Force -Path $cronHHLock
}

# 24時間タスク
# lockファイル(cronDD.lock)が無ければ実行する
$cronDDLock = "cronDD.lock"
If(!(test-path $cronDDLock)){
#echo "24時間タスクをチェックして起動する"  | Out-File $OutputLog -append
    Get-Item * -include dd*.ps1 | ForEach-Object {
        $hour02 = getHourMin (get-date).Hour (get-date).Minute
        #echo $hour02
        if($hour02.substring(0,4) -eq $_.Name.substring(2,4)){
            echo (Get-Date -Format G) $_.Name | Out-File $SchedTaskHist -append
            Invoke-Expression $_
        }
    }
    # lockファイルを作成する
}

# lockファイル(hbJob.lock)が無ければ実行する
$lock = "hbJob.lock"
If(!(test-path $lock)){
    #
    # cmdバッチスクリプトを実行する
    # ・リモート接続用プロセスを起動する
    echo "リモート接続用プロセスを起動する" | Out-File -FilePath $SchedTaskHist -Append
    Start-Process -filepath hbJob.bat -WindowStyle hidden
    #
    # lockファイルを作成する
    New-Item -ItemType File -Force -Path $lock
}

Script構成例

C:\dropbox\PC_Aフォルダ

heartbeat.ps1
hbJob.ps1
hbJob.lock
reboot.lock
hh25_check_service.ps1
hh99_checkdrive.ps1
dd0440_check_service.ps1
hh99_check_service.ps1

KickPS.js※参考を参照
  • Windowsタスクスケジューラからの起動は、"C:\Dropbox\PC_A\KickPS.js" "C:\Dropbox\PC_A\heartbeat.ps1"となる

KickPS.jsコード例

Windowsタスクスケジューラに「heartbeat.ps1」を登録する際、「KickPS.js」経由で起動するようにしている。理由は、「heartbeat.ps1」を直接起動すると、powershellの起動画面が一瞬表示されてしまい作業の邪魔になるから。

wsShell = WScript.createObject("WScript.Shell");
retCode = wsShell.Run("powershell.exe -File " + WScript.Arguments.Item(0),0,true);
WScript.Quit(retCode);

以下のサイトにある内容を参考にしている。

「windows」で「PowerShell」を「一切画面表示せず」に「タスクスケジューラに登録」する方法を再確認
https://qiita.com/Fushihara/items/1576f08825f39706174f

実行ポリシーの変更

デフォルトでは、拡張子ps1を持ったファイルをダブルクリックするなどしても、実行できない。実行ポリシーの変更が必要。例えば下記のようにする。

# 事前にコマンドプロンプトを管理者で起動して以下を実行

C:\Windows\system32> powershell

PS C:\windows\system32> Get-ExecutionPolicy
Restricted

PS C:\windows\system32> Set-ExecutionPolicy RemoteSigned
PS C:\windows\system32> Get-ExecutionPolicy
RemoteSigned

以下のサイトにある内容を参考にしている。

powershell チートシート
https://qiita.com/jca02266/items/a0c71ae90d055ab3893c

関連する記事・ページ

自宅PCをスマホでリモート管理(タスク管理編)
PCをリモート管理する1手法
【コードサンプル】Windowsタスクへの登録例
【コードサンプル】heartbeat.ps1 – 心音確認 PowerShell Script
【コードサンプル】1時間タスクのScript例
【コードサンプル】24時間タスクのScript例
【コードサンプル】hbJob.bat – Windows Bat Script
【コードサンプル】プロセスモニタのScript例
【コードサンプル】IFTTT経由でLINE通知するScript例
【コードサンプル】ネット転送量モニタ

【コードサンプル】Windowsタスクへの登録例

  • Windowsタスクスケジューラに「heartbeat.ps1」を登録する
  • 毎分「heartbeat.ps1」が起動されるように登録する
  • 実は「heartbeat.ps1」を直接起動すると、powershellの起動画面が一瞬表示されてしまい、邪魔なので、「KickPS.js」経由で起動するようにしている(※参考を参照)

①コントロールパネルを起動する。「管理ツール」⇒「タスクスケジューラ」
clip-20190217112510.png
clip-20190217112639.png

または、Win10の設定画面からタスクスケジュールを起動する
clip-20190217114247.png

②「タスクの作成」をクリックする
clip-20190217112805.png

③「名前」に適当なタスク名を設定する
clip-20190217113133.png

④「セキュリティオプション」はそのままでいい
clip-20190217113357.png

⑤「トリガー」タブで、5分くり返しを5本作成する。1分ずつずらすので全体として、毎分起動の設定になる
clip-20190217113454.png

⑥「トリガー」タブの詳細画面。これは上の4番目の例
clip-20190217113538.png

⑦「操作」タブで、「新規」をクリックして、実行するScriptを設定する。ここではheartbeat.ps1直接ではなく、KickPS.jsを起動する
clip-20190217113739.png

  • 引数の追加(オプション):”C:\Dropbox\PC_A\heartbeat.ps1″
  • 開始(オプション):”C:\Dropbox\PC_A”

⑧「OK」をクリックして、③の設定画面にもどる。
clip-20190217113924.png
他の項目(条件・設定・履歴)は変更しなくてよい

⑨設定はこれで完了。念のためPCを再起動しておく。

以下参考にしたリンク

「windows」で「PowerShell」を「一切画面表示せず」に「タスクスケジューラに登録」する方法を再確認
https://qiita.com/Fushihara/items/1576f08825f39706174f

KickPS.js

wsShell = WScript.createObject("WScript.Shell");
retCode = wsShell.Run("powershell.exe -File " + WScript.Arguments.Item(0),0,true);
WScript.Quit(retCode);

関連する記事・ページ

自宅PCをスマホでリモート管理(タスク管理編)
PCをリモート管理する1手法
【コードサンプル】Windowsタスクへの登録例
【コードサンプル】heartbeat.ps1 – 心音確認 PowerShell Script
【コードサンプル】1時間タスクのScript例
【コードサンプル】24時間タスクのScript例
【コードサンプル】hbJob.bat – Windows Bat Script
【コードサンプル】プロセスモニタのScript例
【コードサンプル】IFTTT経由でLINE通知するScript例
【コードサンプル】ネット転送量モニタ