【Windows】スタートアップでPowerShellスクリプトを実行させる方法 ― 脱バッチファイルのススメ

みなさん、こんにちは。

Windowsでの定型業務を自動化する際、古くから親しまれてきたのが「バッチファイル(.bat)」ですよね。バッチファイルをスタートアップフォルダに置いておくだけで、PC起動時に必要なソフトを立ち上げたり、環境を整えたりできる手軽さは非常に魅力的でした。

以前、当サイトでも「Windows起動時に自動でプログラムを実行させる方法」をご紹介しましたが、やはりスタートアップフォルダにバッチファイルを置く方法が、最も手間が少なく快適な自動化の第一歩でした。

しかし、令和のシステム運用、特に高い信頼性が求められる医療IoTや介護現場の端末管理においては、バッチファイルでは力不足を感じる場面が増えてきました。そこで注目したいのが、より高度で柔軟な制御が可能な「PowerShell(.ps1)」への移行です。

今回は、一筋縄ではいかない「PowerShellスクリプトをスタートアップで自動実行させるための設定ポイント」を解説します。

 


 

なぜ.ps1ファイルは直接スタートアップで動かないのか?

 

バッチファイルであれば、ファイルをスタートアップフォルダに置くだけで動作しました。しかし、PowerShellスクリプト(.ps1)を同じように置いても、起動時に開くのは「メモ帳」だったり、あるいは何も起きなかったりします。

これには、Windowsの強力なセキュリティ仕様が関係しています。

実行ポリシーという壁

PowerShellには「実行ポリシー(Execution Policy)」という仕組みがあり、悪意のあるスクリプトが不用意に実行されないよう、デフォルトではダブルクリックによる実行が無効化されています。これは、現場の重要な端末をウイルスや誤操作から守るための大切なガードレールなのですが、自動化を試みる私たちにとっては最初のハードルとなります。

本体へのパス指定が必要

バッチファイルはOS標準のコマンドプロンプトが直接解釈しますが、PowerShellは「powershell.exe」というプログラムに対して「このファイルを実行してね」と明示的に指示を出す必要があります。

 


 

実践 – ショートカットを活用した自動起動設定

 

PowerShellをスタートアップで動かす「正解」は、直接ファイルを置くのではなく、「特定のオプションを付与したショートカット」を配置することです。

手順は以下の通りです。

手順1 – ショートカットの作成

  1. 実行したい .ps1 ファイルを右クリックし、「ショートカットの作成」を選択します。
  2. 作成されたショートカットを右クリックし、「プロパティ」を開きます。

手順2 – リンク先の書き換え

「ショートカット」タブにある「リンク先」という項目を、以下のように書き換えます。

powershell.exe -ExecutionPolicy Bypass -File "C:\Scripts\your-script.ps1"

ここでのポイントは -ExecutionPolicy Bypass というオプションです。これにより、システム全体のセキュリティ設定を変更することなく、このスクリプトを実行する時だけ一時的に制限を回避することができます。実務上の安全性を確保しつつ自動化を実現する、非常にスマートな手法です。

この手法は、以前ご紹介した「PowerShellスクリプトをタスクスケジューラで完璧に自動実行させる方法」でも詳しく解説していますので、より複雑な条件(特定の時間やトリガーなど)で動かしたい方はあわせてご覧ください。

手順3 – 黒い画面(コンソール)を出したくない場合

現場で運用する端末の場合、起動時に一瞬でも黒い画面が出ると、現場のスタッフが「故障かな?」と不安に感じてしまうことがあります。これを防ぐには、さらにオプションを追加します。

powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -File "C:\Scripts\your-script.ps1"

-WindowStyle Hidden を加えることで、ユーザーの目に触れることなく、バックグラウンドで静かに処理を実行させることが可能です。

 


 

医療・介護現場でも役立つ「パス指定」と「ログ出力」のコツ

 

医療機器のモニタリングやセンサーデータの収集など、IoT的な運用を行う場合、スクリプトが正常に動いたかどうかの「証拠(ログ)」を残すことは極めて重要です。

しかし、スタートアップから起動されたスクリプトは、作業ディレクトリが予期せぬ場所(System32など)になってしまうことがあり、ログファイルの書き込みエラー(権限不足)が頻発します。

これを防ぐため、スクリプトの冒頭には必ず以下の魔法のコードを記述しておきましょう。

# 実行中のスクリプトがあるフォルダを特定して移動
$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
Set-Location $PSScriptRoot

# 同じフォルダに実行ログを出力開始
Start-Transcript -Path "$PSScriptRoot\operation_log.txt" -Append

このように「スクリプト自身がどこにいるか」を明示的に認識させることで、USBメモリからの実行やネットワーク共有フォルダ内での運用でも、パス迷子を防ぐことができます。

 


 

Windows 10 と Windows 11 での挙動の違い

 

ここが今回の重要なアップデート項目です。OSのバージョンによって、少しだけ見え方が異なります。

Windows 10の場合

従来通りの動作です。-WindowStyle Hidden を指定すれば、ほとんどの場合、画面に影響を与えずに実行されます。

Windows 11の場合

Windows 11では、標準のコンソールホストが「Windows ターミナル」に統合される動きがあります。

設定によっては、-WindowStyle Hidden を指定していても、一瞬だけウィンドウの枠が表示されたり、タスクバーにアイコンが表示されたりすることがあります。

もし完全に気配を消したい場合は、より上位の制御(VBScriptを経由させるなど)が必要になるケースもありますが、一般的な管理用途であれば、上記の設定で十分実用的です。

 


 

バックグラウンドで動くスクリプトを止めるには?

 

-WindowStyle Hidden で起動したスクリプトは、画面にウィンドウが出ていないため、×ボタンで閉じることができません。

「スクリプトを修正したので、今動いているものを一度止めたい」という場合は、タスクマネージャーを使用します。

  1. Ctrl + Shift + Esc でタスクマネージャーを起動します。
  2. 「詳細」タブを開き、powershell.exe を探します。
  3. もし複数のPowerShellが動いていて判別できない場合は、列の見出しを右クリックして「選択」から「コマンドライン」を表示させてください。
  4. 実行しているスクリプトのパスが表示されるので、対象を確認して「タスクの終了」を選択します。

 


 

PowerShellによる堅牢な自動化を目指して

 

バッチファイルからPowerShellへの移行は、最初は少し面倒に感じるかもしれません。しかし、エラーハンドリングの柔軟性や、外部APIとの連携、そして今回ご紹介したような詳細な実行制御は、一度慣れてしまうと手放せない便利さがあります。

特に、止まることが許されない現場のシステムを預かる身としては、PowerShellによる堅牢な自動化は強力な武器になります。

「shell:startup」のショートカット設定一つで、Windowsがより快適になるはずです。ぜひ試してみてください。

 

本日も最後までお読みいただきありがとうございました。

それでは、よいWindowsライフを!

カテゴリ: 開発インフラ

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール