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