【PowerShell】タスクスケジューラでスクリプトを自動実行する方法

  • URLをコピーしました!
目次

はじめに

PowerShell で便利なスクリプトを作ったものの、「毎日手動で実行するのは面倒だな…」と感じたことはありませんか? せっかくの自動化スクリプトも、人間の手で起動していては本来の力を発揮しきれません。そこで活躍するのが、Windows に標準搭載されている「タスクスケジューラ」との連携です。

この記事でわかること
  • PowerShell をタスクスケジューラで確実に実行するための基本知識
  • 多くの人がつまずく「実行ポリシー(ExecutionPolicy)」の回避テクニック
  • メッセージボックス付きの「自動サインアウトスクリプト」の作成手順
  • タスクスケジューラへの具体的な登録・引数設定のステップ

PowerShell をタスクスケジューラで動かすメリットと注意点

スクリプトをタスクスケジューラに登録する前に、まずは「なぜこの組み合わせがよいのか」と、「知っておくべき注意点」を押さえておきましょう。

なぜタスクスケジューラを使うのか?(定期実行・自動化の基本)

タスクスケジューラは、Windows のバックグラウンドで指定した条件(トリガー)に合わせてプログラムを自動起動してくれる標準機能です。

PowerShell と組み合わせることで、以下のようなメリットが生まれます。

完全な手放し運用が可能になる

「毎日18時に実行」「パソコン起動時に実行」など、人間が忘れていてもシステムが確実に処理を行ってくれます。

追加ソフトが不要

Windows 標準機能だけで完結するため、会社のセキュリティ規定などでフリーソフトがインストールできない環境でも、強力な業務自動化ツールとして活用できます。

【重要】最大のつまずきポイント「実行ポリシー(ExecutionPolicy)」とは

いざタスクスケジューラに PowerShell スクリプト(.ps1 ファイル)を登録して実行してみると、「設定は合っているはずなのにスクリプトが動かない」というトラブルが頻発します。

この原因の9割は、Windows のセキュリティ機能である「実行ポリシー(ExecutionPolicy)」によるブロックです。 Windows は初期設定の状態で、悪意のあるスクリプトが勝手に実行されないよう、.ps1 ファイルの実行を固く禁じています。

💡解決策: 引数で Bypass を指定する

これを解決するために、システム全体のセキュリティ設定を危険にさらしてまで制限を解除する必要はありません。 タスクスケジューラから PowerShell を呼び出す際に、「このタスクの時だけはセキュリティチェックをスルーしてね」というパスワード(引数)を渡してあげます。

それが -ExecutionPolicy Bypass という引数(オプション)です。

タスクスケジューラに登録する際は、単にスクリプトを指定するだけでなく、この Bypass コマンドをセットで記述することが、キモになります。

実践例 | 自動サインアウトスクリプトの作成

では、タスクスケジューラに登録するためのスクリプトを作成します。

今回作成するシステムの概要

タスクスケジューラで設定した時刻になると、画面に「1分後にサインアウトします。よろしいですか?」という警告メッセージが表示されます。 ユーザーが「OK」をクリックすると、60秒間の待機後に自動でサインアウト(ログオフ)処理が実行される仕組みです。長時間労働の防止や、離席時のセキュリティリスク低減に活用できます。

PowerShell スクリプトの全体コード

以下のコードをコピーして使用してください。

# ----------------------------------------------------------------------------
# Author: tomo
# Creation Date: 2023-06-24
#
# This script is free to use and modify at your own discretion.
# No warranty is provided for the script's functionality.
# Use this script at your own risk.
# ----------------------------------------------------------------------------
Add-Type -AssemblyName PresentationFramework

# 引数でメッセージボックスのメッセージとタイトルを指定
function Show-MessageBox ($message, $title)
{
    [System.Windows.MessageBoxButton] $button = 'OKCancel'
    [System.Windows.MessageBoxImage] $image = 'Warning'

    # MessageBox.Showメソッドを使用してメッセージボックスを表示
    $result = [System.Windows.MessageBox]::Show($message, $title, $button, $image)

    return $result
}

# タイトルとメッセージを指定してメッセージボックスを表示
$message = '1分後にサインアウトします。よろしいですか?'
$title = 'サインアウトのお知らせ'
$result = Show-MessageBox -message $message -title $title

# OKボタンが押されたら1分後にサインアウト
if ($result -eq 'OK')
{
    Start-Sleep -Seconds 60
    shutdown.exe /l
}

スクリプトファイルの保存方法(.ps1 拡張子について)

コピーしたコードを実行可能なファイルとして保存します。

  1. メモ帳などのテキストエディタを開き、コードを貼り付けます。
  2. 「名前を付けて保存」を選択します。
  3. ファイル名を AutoSignout.ps1 のように指定し、拡張子を .ps1 にします(PowerShell スクリプトの拡張子です)
  4. ポップアップの日本語が文字化けするのを防ぐため、文字コードは「UTF-8」を選択して保存します。
  5. 任意のフォルダ(例:C:\Scripts\AutoSignout.ps1 など)に配置します。

タスクスケジューラに登録する際、ここで保存した「ファイルのフルパス」を使用します。

タスクスケジューラへの登録手順

作成した PowerShell スクリプト(.ps1 ファイル)をタスクスケジューラに登録し、自動実行のスケジュールを設定します。

タスクスケジューラの起動と基本タスクの作成

  1. Windows の「スタートメニュー」を開き、「タスクスケジューラ」と検索して起動します。
  2. 画面右側の「操作」メニューから、「基本タスクの作成」 を選択します。
  3. 「基本タスクの作成ウィザード」が開くので、「名前」に任意のタスク名(例: 自動サインアウト)を入力し、「次へ」をクリックします。

トリガーの設定(毎日〇時に実行など)

スクリプトを実行するタイミング(トリガー)を設定します。

  1. 「タスクトリガー」の画面で、実行頻度を選択します。今回は 「毎日」 を選択して「次へ」をクリックします。
  2. 次の画面で、実行を開始する「日付」と「時刻」を設定します(例:終業時刻の 18:00:00 など)設定後、「次へ」をクリックします。

プログラムの開始設定(powershell.exe の指定と引数の書き方)

次に、実行するアクションを設定します。ここで、上記で解説した「実行ポリシー(ExecutionPolicy)の回避」を設定する必要があります。

  1. 「操作」の画面で、「プログラムの開始」 を選択して「次へ」をクリックします。
  2. 「プログラムの開始」設定画面で、以下のように入力します。
  • プログラム/スクリプト: powershell (または powershell.exe
  • 引数の追加 (オプション): -ExecutionPolicy Bypass -File "C:\Scripts\AutoSignout.ps1"

ファイルパスは、スクリプトを保存した実際のフルパスに置き換えてください。パスにスペースが含まれる場合は必ずダブルクォーテーションで囲みます。

  1. 「次へ」をクリックし、設定内容の「要約」画面を確認します。
  2. 問題なければ「完了」をクリックしてウィザードを終了します。

これで、指定した日時にタスクスケジューラが PowerShell を呼び出し、実行ポリシーをバイパスしてスクリプトを自動実行する設定が完了しました。

スクリプトの仕組み解説

最後に、今回使用した PowerShell スクリプトの主要な処理について解説します。仕組みを理解することで、他の自動化スクリプトを作成する際の応用が可能になります。

メッセージボックス(GUI)の呼び出し方

PowerShell は通常、コンソール画面(CUI)で動作しますが、.NET Framework の機能を読み込むことで Windows の標準的なポップアップ画面(GUI)を表示できます。

冒頭の Add-Type -AssemblyName PresentationFramework が、その GUI 機能を使用するための宣言です。 関数 Show-MessageBox 内では、表示するボタン(OKCancel)やアイコン(Warning)を定義し、[System.Windows.MessageBox]::Show メソッドで実際のメッセージボックスを画面に呼び出しています。この処理により、ユーザーがどのボタンを押したかという結果が変数 $result に格納されます。

ユーザーの選択(OK/Cancel)に応じた条件分岐とシャットダウンコマンド

スクリプトの後半では、ユーザーの操作結果に応じた条件分岐を行っています。

if ($result -eq 'OK')
{
    Start-Sleep -Seconds 60
    shutdown.exe /l
}

変数 $result の値が OK と一致する(-eq)場合のみ、波括弧 {} 内の処理が実行されます。 Start-Sleep -Seconds 60 でシステムを 60 秒間待機させた後、Windows の標準コマンドである shutdown.exe /l が実行されます。この /l オプションは「ログオフ(サインアウト)」を指定する引数です。 もしユーザーが「Cancel」を押したり、ウィンドウを閉じたりした場合は、この条件に合致しないため、何も実行されずにスクリプトが終了します。

まとめ

本記事では、PowerShell スクリプトをタスクスケジューラで自動実行するための具体的な手順を解説しました。

  • スクリプトの実行を完全に自動化でき、手作業による実行漏れを防ぐことができます。
  • タスク登録時の引数に -ExecutionPolicy Bypass の指定はスクリプトを確実に動作させる上で必要
  • 今回作成した自動サインアウトの仕組みは、様々なバックグラウンド処理に応用可能です。

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

インフラ(クラウド/NW/仮想化)から Web 開発まで、技術領域を横断して活動するエンジニア💻 コンシューマー向けエンタメ事業での新規開発・運営経験を活かし、実戦的な技術ノウハウを発信中

[ Certs ] CCIE Lifetime Emeritus / VCAP-DCA ✒️ [ Life ] 技術書・ビジネス書愛好家📖 / 小・中学校で卓球コーチ👟

目次