亀の甲羅2

今日もまた朝とく起きて励まなん窓に明るきありあけの月

powershell : 決まった時間にシャットダウンするタスク(1回だけ)

シャットダウンを指定時刻に行いたい。

cronやatコマンドがないWindowsでどうやるのか調べてみた。まだまだ不便だなぁ。 タスクスケジューラ+シャットダウンコマンド実行で実現する。

1. シャットダウンコマンド(powershell

シャットダウン
 $ stop-computer

ちなみに再起動の場合は、以下の通り。

再起動
 $ restart-computer

それぞれ-forceオプションがあり、強制実行もできる。

2. タスクスケジューラで登録

もう、ここの人がきれいにまとめてくれているよね。
Powershellでタスクスケジューラ登録 - Qiita

#Creates an object that contains a scheduled task principal. (xxxxxx -> 自分のユーザ名など)
$User = New-ScheduledTaskPrincipal -UserId xxxxxx -LogonType password

#Creates a scheduled task action.(例としてのメモ帳起動)
$Act = New-ScheduledTaskAction -Execute "notepad.exe"

#Creates a scheduled task trigger object.(トリガーは23時)At の後ろはDatetime型。-Onceオプションは1回キリってこと。
$Time = New-ScheduledTaskTrigger -Once -At 23pm

#Creates a scheduled task instance.
$Task = New-ScheduledTask -Trigger $Time -Principal $User -Action $Act

#Registers a scheduled task definition on a local computer.(xxxxxx -> 自分のユーザ名など)
Register-ScheduledTask -InputObject $Task -TaskName "test" -TaskPath \ -User xxxxxx 

# このレジスター(登録)コマンドを実行すると、単にWindowsのタスクスケジューラに登録されるだけ。

GUIのタスクスケジューラを使ったことがある人ならば、後は分かるでしょう。

# タスクの無効化
Disable-ScheduledTask test

# タスクの有効化
Enable-ScheduledTask test

# 実行
Start-ScheduledTask test

# 停止
Stop-ScheduledTask test

# タスクの削除(タスクスケジュラーから削除される)・・・1回しか実行しないようなタスクをわざわざ登録・削除するのは馬鹿らしいのだけど。なので、Linuxのatコマンドと等価にはならない。
Unregister-ScheduledTask 

New-ScheduledTaskTriggerの設定方法(オプション部分のみ)

#-Once -At "2022/12/24 12:00" クリスマスに1回のみ
#-Daily -At 10:00 毎日9時
#-Weekly -DaysOfWeek Monday -At 9:00 毎週月曜の9時
#-Weekly -DaysOfWeek @("Monday","Wednesday","Friday") -At 9:00 毎週月水金の9時
#-RepetitionInterval (New-TimeSpan -Minutes 10) -At (Get-Date) -Once 今から10分ごとに
#-RepetitionInterval (New-TimeSpan -Hours 1) -At 08:00 -Once 8時から1時間ごとに
#-RepetitionInterval (New-TimeSpan -Minutes 10) -RepetitionDuration (New-TimeSpan -Hours 8) -At (Get-Date) -Once 今から8時間後まで10分間隔で

あまりに面倒な設定なら、ベースだけ設定してGUIで設定した方が楽。

じゃあ、1回だけxx時にシャットダウンするタスクを作ってみよう

$User = New-ScheduledTaskPrincipal -UserId XXXX -LogonType password

$Act = New-ScheduledTaskAction -Execute "powershell" -Argument '-NoProfile -ExecutionPolicy RemoteSigned -command "stop-computer"'
#'powershell -NoProfile -ExecutionPolicy RemoteSigned -command "stop-computer"' だとうまくいかない。
#スクリプトファイル化してスクリプトCallならうまくいくと思うが、powershellコマンド直打ちだと工夫が必要みたい。

$Time = New-ScheduledTaskTrigger -Once -At "2022/12/25 0:11"

$Task = New-ScheduledTask -Trigger $Time -Principal $User -Action $Act

Register-ScheduledTask -InputObject $Task -TaskName "test2" -TaskPath \ -User XXXX 

バージョン情報

PS > $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.19041.2364

参考