はじめに
タスクスケジューラでPowerShell
のスクリプトを実行したときに、オプションのウィンドウを非表示-WindowStyle Hidden
を指定しても、期待に反して一瞬青い画面が表示されてしまいます。
短時間のタスクを実行する際に、一瞬でも画面が表示されるのはあまり好ましい状態ではありません。
なぜ一瞬青い画面が表示されてしまうのか
PowerShellのGitHubのIssueに書かれている内容です。
powershell.exe is a console application. The console window is automatically created by the OS when the process starts. The powershell.exe code that processes -WindowStyle Hidden is therefore executed after the console window is opened hence the flash.
PowerShellのGitHubのIssue
Google翻訳:
powershell.exe はコンソール アプリケーションです。プロセスの開始時に、コンソール ウィンドウは OS によって自動的に作成されます。したがって、-WindowStyle Hidden
を処理する powershell.exe コードは、コンソール ウィンドウが開かれた後に実行されるため、フラッシュが発生します。
VBScriptは避けたい
完全に非表示にしたい場合、ネット検索するとVBScript
を使用した方法が散見されます。
しかし、VBScript
は残念ながら廃止方向(2027年頃にデフォルトで無効)になっているため使用するのは避けたいです。
conhostを利用する方法
他にいい方法がないか調べたところconhost
を利用する方法を見つけたので備忘録として記事にしておきます。
conhostとは
Windowsオペレーティングシステムの一部で、コマンドプロンプトやPowerShellなどのコンソールアプリケーションのユーザーインターフェースを管理するプロセスです。具体的には、テキストのレンダリングやコピー・ペースト機能などを提供します。Windows Vista以降のバージョンで導入されました。
通常、システムのC:\Windows\System32フォルダーに格納されており、Windowsの起動時に自動的に起動します。
headlessオプション
conhost
にはオプションにheadless
があり、コンソールウィンドウを表示せずにバックグラウンドでコマンドを実行するためのオプションです。これにより、コンソールアプリケーションがユーザーに見えない形で実行されるため、視覚的な干渉を避けることができます。
コマンドプロンプトで確認できます。
conhost --headless powershell -NoProfile -ExecutionPolicy Bypass -File C:\Tool\Task\example.ps1
タスクスケジューラーの指定方法
C:\Tool\example.ps1 を動かす場合
1.プログラム/スクリプトに「conhost.exe」をセットします
2.引数の追加に「--headless powershell -NoProfile -ExecutionPolicy Bypass -File C:\Tool\Task\example.ps1」をセットします
3.開始(オプション)に「C:\Tool\task」をセットします
実行後
タスクスケジューラからタスクを実施、PowerShellスクリプトが非表示で実行され、CSVファイルが出力された。
補足
-
PowerShellのオプション
-NoProfile
は、PowerShellの実行時に読み込む環境情報を読み込まないため、起動が多少速くなります。不要な場合は指定しなくてもいいです -
タスクスケジューラーの開始(オプション)は、PowerShellスクリプトの作業用の「カレントディレクトリ」を指定するためです。不要な場合は指定しなくてもいいです
CSVファイル出力スクリプト
サンプルで使用したCSVファイル出力スクリプト
# 出力するCSVファイルのパス
$csvFilePath = "output.csv"
# 出力するCSVファイルのパス
$data = @(
[PSCustomObject]@{ID=1; 名前="山田"; 年齢=30},
[PSCustomObject]@{ID=2; 名前="佐藤"; 年齢=25},
[PSCustomObject]@{ID=3; 名前="鈴木"; 年齢=40}
)
# 一旦UTF-8でエクスポートし、それをShift_JISで保存
$data | Export-Csv -NoTypeInformation $csvFilePath -Encoding Default
最後に
これで、非表示のためだけにVBScript
を使用することとおさらばすることができますね。