1. スクリプト概要
スクリプト名: timer_(beep or sleep).ps1
指定した時間経過後に、アラーム音を鳴らすか、PCを休止状態にするかのいずれかを行います
2. 処理と目的
処理の流れ
1. 指定時間経過後の動作(アラームまたはPC休止)を選択します
2. 動作までの待機時間を時・分・秒で指定します
3. 指定時間までカウントダウンを表示しながら待機します
4. 手順1で指定した動作を実行します
目的
PCで長時間かかる処理を実行している間にPCから離れる際、処理完了後にPCを自動的に休止状態にすることを主な目的としています。アラーム機能は補助的なものです
3. 動作環境と要件
PowerShellのバージョン
7.0以上
OS
Windows10
必要なモジュール
特になし
必要な権限
特になし
その他の設定
特になし
4. 使用方法
基本的な実行方法
スクリプトコードを拡張子ps1
で保存してPowershellで実行してください。
ファイルを保存する際は、文字コードをUTF8 BOM付
にしてください。
パラメータ
なし
使用例
- コマンドラインで
pwsh "timer_(beep or sleep).ps1"
を実行 - 指定時間後の処理を入力します
- 指定時間の時分秒を入力します
5. スクリプトコード
# 時間表示用の関数を定義します
function ViewTime( $t ){
$outMessage = ""
if ( $t.Hours -gt 0 ){
$outMessage += "$($t.Hours)時間 "
}
if ( $t.Minutes -gt 0 ){
$outMessage += "$($t.Minutes)分 "
}
if ( $t.Seconds -gt 0 ){
$outMessage += "$($t.Seconds)秒 "
}
return $outMessage
}
# ホストのUI設定(ウィンドウタイトル、サイズ、バッファサイズ)
$host.UI.RawUI.WindowTitle = 'timer'
$host.UI.RawUI.WindowSize = New-Object System.Management.Automation.Host.Size(50,15)
$host.UI.RawUI.BufferSize = New-Object System.Management.Automation.Host.Size(50, 9999)
do {
$executeType = Read-Host '待機の処理(0:アラーム、1:PCの休止)'
} while(-not $executeType -in ('0','1')) # 0または1が入力されるまで繰り返す
$WAIT_HOUR = 0
do {
$inputText = Read-Host "何時間?"
$inputText = Invoke-Expression ('0' + $inputText)
}while( -not ([Double]::TryParse($inputText, [ref] $WAIT_HOUR)) )
$WAIT_MINUTS = 0
do {
$inputText = Read-Host "何分?"
$inputText = Invoke-Expression ('0' + $inputText)
}while( -not ([Double]::TryParse($inputText, [ref] $WAIT_MINUTS)) )
$WAIT_SECOND = 0
do {
$inputText = Read-Host "何秒?"
$inputText = Invoke-Expression ('0' + $inputText)
}while( -not ([Double]::TryParse($inputText, [ref] $WAIT_SECOND)) )
$startTime = Get-Date # スクリプト開始時刻を取得
# 入力された時分秒から待機時間をTimeSpanオブジェクトとして計算
$waitTime = New-TimeSpan -seconds ($WAIT_HOUR*3600 + $WAIT_MINUTS*60 + $WAIT_SECOND)
# 待機時間の表示メッセージを作成
$outMessage = ViewTime($waitTime)
# 選択された処理に応じて表示メッセージとウィンドウタイトルヘッダを設定
if($executeType -eq '1'){
ECHO "$($outMessage)待機後にPCを休止状態にします" # PC休止の場合のメッセージ
$headText = "休止" # ウィンドウタイトルヘッダ
} else {
ECHO "$($outMessage)待機後にアラーム音を鳴らします" # アラームの場合のメッセージ
$headText = "Alarm" # ウィンドウタイトルヘッダ
}
$beforeOutMessage = ""
# カウントダウン表示ループ
while( $waitTime -gt ( (Get-Date) - $startTime) ){
$remainTime = $waitTime - ((Get-Date) - $startTime) # 残り時間を計算
$strRemainTime = ViewTime $remainTime # 残り時間の表示文字列を作成
$outMessage = "残り時間:$($strRemainTime)" # 出力メッセージを作成
# カーソル位置から前の表示をクリアするための処理
$delStringLength = $host.UI.RawUI.CursorPosition.X
Write-Host -NoNewline "".PadRight($delStringLength,"`b") # カーソルを左に移動
Write-Host -NoNewline "".PadRight($delStringLength," ") # スペースで上書きしてクリア
Write-Host -NoNewline "".PadRight($delStringLength,"`b") # カーソルを元の位置に戻す
Write-Host -NoNewline $outMessage # 残り時間を表示(改行なし)
(Get-Host).UI.RawUI.WindowTitle = ("${headText} ${strRemainTime}") # ウィンドウタイトルを更新
$beforeOutMessage = $outMessage
Sleep 1
}
# 経過時間を計算
$processTime = (Get-Date) - $startTime
$processTime
$outMessage = "$(ViewTime($processTime))経ちました"
ECHO $outMessage
# 選択された処理を実行
if($executeType -eq '1'){
#休止
echo "休止状態にします"
$suspendtype = $true # trueで休止、falseでスリープ
# $suspendtype = $false #Sleep
# powrprof.dllのSetSuspendState関数をC#のコードとして追加
$signature = @"
[DllImport("powrprof.dll")]
public static extern bool SetSuspendState(bool Hibernate,bool ForceCritical,bool DisableWakeEvent);
"@
$func = Add-Type -memberDefinition $signature -namespace "Win32Functions" -name "SetSuspendStateFunction" -passThru
# SetSuspendState関数を呼び出してPCを休止状態にする
$func::SetSuspendState($suspendtype,$false,$false)
} else {
# アラームを鳴らす処理
# SAPI.SpVoice COMオブジェクトを作成し、メッセージを読み上げる
(New-Object -ComObject SAPI.SpVoice).Speak($outMessage)
}
echo "5秒待機します..."
(5..1) | %{Write-Host $_ -NoNewline;sleep 1}
6. 注意事項と既知の問題
制約事項
アラームやPC休止までの時間は厳密に計測しているわけではないため、多少の誤差が発生する可能性があります
既知のバグ
もしバグを発見された場合は、コメントでご報告ください。
トラブルシューティング
・ps1ファイルのエンコーディングには注意してください。
7. 免責事項
本スクリプトにはいかなる保証もありません。使用は自己責任で行ってください。