0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

timer_(beep or sleep).ps1

Posted at

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付にしてください。

パラメータ
なし

使用例

  1. コマンドラインでpwsh "timer_(beep or sleep).ps1"を実行
  2. 指定時間後の処理を入力します
  3. 指定時間の時分秒を入力します

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. 免責事項

本スクリプトにはいかなる保証もありません。使用は自己責任で行ってください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?