【コードサンプル】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例
【コードサンプル】ネット転送量モニタ