3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

タスクスケジューラでconhostを使用したPowerShellスクリプトの非表示化

Posted at

はじめに

タスクスケジューラで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 を動かす場合

image.png

1.プログラム/スクリプトに「conhost.exe」をセットします
2.引数の追加に「--headless powershell -NoProfile -ExecutionPolicy Bypass -File C:\Tool\Task\example.ps1」をセットします
3.開始(オプション)に「C:\Tool\task」をセットします

実行後

タスクスケジューラからタスクを実施、PowerShellスクリプトが非表示で実行され、CSVファイルが出力された。
image.png

補足

  • PowerShellのオプション -NoProfile は、PowerShellの実行時に読み込む環境情報を読み込まないため、起動が多少速くなります。不要な場合は指定しなくてもいいです

  • タスクスケジューラーの開始(オプション)は、PowerShellスクリプトの作業用の「カレントディレクトリ」を指定するためです。不要な場合は指定しなくてもいいです

CSVファイル出力スクリプト

サンプルで使用したCSVファイル出力スクリプト

example.ps1
# 出力する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を使用することとおさらばすることができますね。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?