HOWTO · PowerShell
ウィンドウを表示せずに PowerShell スクリプトを実行する方法
powershell.exe のウィンドウを表示せずにスクリプトを実行する方法を紹介します。-WindowStyle Hidden を指定する直接起動、バッチファイル経由の起動、タスクスケジューラでの無人実行の手順をたどり、PSExec や NSSM が向く用途と、ウィンドウが一瞬見えるといった限界も確認します。
このページの内容
Windows では、powershell.exe -NoProfile -WindowStyle Hidden -File "C:\Scripts\Task.ps1" を使ってスクリプトを起動します。引用符で囲まれたパスは、スクリプトの絶対パスに置き換えてください。-WindowStyle Hidden パラメーターは PowerShell ウィンドウの外観を制御しますが、すべてのランチャーや子アプリケーションが不可視のままであることを保証するものではありません。
-WindowStyle Hidden を使って PowerShell を実行する
上記のコマンドは、[ファイル名を指定して実行] ダイアログなどの Windows ランチャーから使用します。-File はスクリプトを特定します。引用符は、スペースを含むパスを保護します。-NoProfile はプロファイルのスタートアップ スクリプトをスキップするため、タスクは自身の依存関係を読み込む必要があります。
ウィンドウの可視性はホストと起動コンテキストに依存します。起動時にコンソールが一瞬表示されることがあります。すでに開いているターミナルを隠すためにこのコマンドに頼らないでください。スクリプトによって起動されたアプリケーションは、独自のウィンドウを表示できます。非表示のウィンドウも、タスク マネージャーからプロセスを隠すわけではありません。
この記事の Windows 起動手順は実行されていないイラストであり、観察されたウィンドウの動作やコマンド出力は提供されていません。
バッチ ファイルからスクリプトを起動する
run_script.bat に 2 行を保存します。1 行目は @echo off、2 行目は powershell.exe -NoProfile -WindowStyle Hidden -File "C:\Scripts\Task.ps1" です。実行する前にパスを置き換えてください。
@echo off は、バッチ コンソールでのコマンド エコーを抑制します。そのコンソールを隠したり、スクリプトの出力を抑制したり、起動時の点滅を防いだりするものではありません。バッチ ファイルは繰り返しの起動に便利ですが、対話型コンソールのない無人作業にはタスク スケジューラのほうが適しています。
タスク スケジューラでスクリプトを実行する
- タスク スケジューラ を開き、タスクの作成 を選択して、タスクにわかりやすい名前を付けます。
- 全般 で、スクリプトとそのリソースにアクセスできるアカウントを選択します。無人作業の場合は、ユーザーがログオンしているかどうかにかかわらず実行する を選択し、求められたら資格情報を入力します。これは非対話型コンテキストを使用します。デスクトップとの対話を必要とするスクリプトは失敗することがあります。最上位の特権で実行する は、タスクに昇格が必要で、アカウントがそれを許可されている場合にのみ有効にしてください。昇格は可視性を制御しません。
- トリガー で、必要なスケジュールやイベントを追加します。
- 操作 で、新規 と プログラムの開始 を選択します。インストールされている
powershell.exe実行可能ファイルを選択します。引数の追加 に-NoProfile -NonInteractive -WindowStyle Hidden -File "C:\Scripts\Task.ps1"と入力します。開始場所 を引用符なしでC:\Scriptsに設定し、両方のパスを適宜調整します。-NonInteractiveは入力プロンプトがユーザーを待つのを防ぎますが、ウィンドウを隠すものではありません。 - タスクを保存し、右クリックして 実行 を選択し、手動テストを行います。これにより、トリガーを待たずに即座に開始します。その履歴、前回の実行結果、スクリプトのログを確認してください。
PSExec や NSSM は適したタスクにのみ使用する
Microsoft Sysinternals の PSExec は、リモート管理や別のアカウントでの実行に適しています。その -d オプションは「待機しない」という意味で、-s は SYSTEM アカウントを選択します。どちらもウィンドウを隠すスイッチではありません。SYSTEM はユーザー アカウントとは異なるリソース アクセスを持ちます。これらのオプションは、通常の非表示起動には不要です。
NSSM (Non-Sucking Service Manager) は、アプリケーションを Windows サービスとしてラップします。公式ダウンロード サイト https://nssm.cc/download から入手してください。サービスのインストールには管理者権限が必要です。PowerShell 実行可能ファイル、スクリプトの引数、作業ディレクトリ、サービス アカウント、ログ記録、再起動の動作を慎重に構成してください。対話型デスクトップを必要としないサービス的なワークロードに使用してください。短いスケジュール済みスクリプトには通常、タスク スケジューラだけで十分です。実行ポリシーのバイパスはスクリプト ポリシーの扱いを変更するもので、ウィンドウの可視性は変更せず、ウィンドウを隠すために必要なものでもありません。
スクリプトをテストし、適切な方法を選ぶ
まず、対象のアカウントでスクリプトを表示した状態で実行します。ファイルのアクセス許可、依存関係、絶対パス、実行ポリシーに関するメッセージを確認してください。スケジュールされたアカウントには、あなたのマップされたドライブやプロファイル設定がない場合があります。出力とエラーは、そのアカウントが書き込める場所に保存してください。ウィンドウが消えたことは、成功の証拠にはなりません。
この自己完結型の PowerShell ログ記録の例は実行されていません。完了メッセージを一時ファイルに書き込み、それを読み取り、その後ファイルを削除します。
$logPath = [System.IO.Path]::GetTempFileName()
try {
'Task completed' | Set-Content -LiteralPath $logPath
Get-Content -LiteralPath $logPath
}
finally {
Remove-Item -LiteralPath $logPath
}
実際のスクリプトでは、安定したログ ファイルを保持し、完了だけでなく失敗も記録してください。時々の使用には直接起動、便利さにはバッチ ファイル、無人トリガーにはタスク スケジューラ、サービス ワークロードには NSSM を選択してください。非表示の起動に頼る前に、対象の Windows マシンでデスクトップに依存する動作を確認してください。