Misc.

2022/04/28

[Sample Script]スケジュールされたタスクをコマンドラインから即時実行して終わるまで待つ

「準備完了」状態のタスクを即時実行して、完了するまで待つPowerShell スクリプトを作ってみた。 「キューに挿入されました」状態も即時実行。「実行中」の場合は、完了するまで待つ。「無効」のときは何にもしない。タスクスケジューラ(taskschd.msc)でタスクを右クリックして「実行する」をクリックして、終わるまで待っているのと同じことをする。

使い方:

.\runtask.ps1 "タスク名" "タスクパス"

※タスクパスは(半角の)¥終わりで。ルートは"¥" 


特定の条件設定がある場合に、キューに挿入状態にならないように、Schtasks /Run /I を使っているのがポイント。

[runtask.ps1]

------------------------------------------------------------------------------------
param($taskname,$taskpath)
#$taskname = ".NET Framework NGEN v4.0.30319 Critical"
#$taskpath = "\Microsoft\Windows\.NET Framework\"

$taskfullname = $taskpath+$taskname
$taskstate = (get-scheduledtask -taskname $taskname -taskpath $taskpath -ErrorAction SilentlyContinue).State

if ($taskstate -eq $null) {
  Write-Host "Error : $taskname is not exist."
  exit
}
if ($taskstate -eq "Disabled") {
  Write-Host "$taskname is $taskstate : nothing to do."
} elseif ($taskstate -eq "Ready") {
  Write-Host -NoNewLine "Start $taskname."
  #Start-ScheduledTask -taskname $taskname -taskpath $taskpath
  SCHTASKS /Run /I /TN $taskfullname
} elseif ($taskstate -eq "Running") {
  Write-Host -NoNewLine "$taskname is already running."
} else {
  SCHTASKS /Run /I /TN $taskfullname
  Write-Host -NoNewLine "$taskname is already in progress."
}

while(1) {
  $taskstate = (get-scheduledtask -taskname $taskname -taskpath $taskpath -ErrorAction SilentlyContinue).State
  if ($taskstate -eq "Ready") {
    Write-Host "Task completed. (Ready)"
    break
  } elseif ($taskstate -eq "Disabled") {
    Write-Host "Task completed. (Disabled)"
    break
  } else {
    Write-Host -NoNewLine "."
  }
  Start-Sleep -seconds 1
}
------------------------------------------------------------------------------------
ダウンロードはこちら、https://github.com/yamauchikazu/public

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。