PowerShell のウィンドウを一切表示させずに実行する

こんなネタは今まで紹介したことなかったっけ?

PowerShell のスクリプトファイル .ps1 を実行する際、どうしても PowerShell のウィンドウが開いてしまって鬱陶しい。

-WindowStyle Hidden というオプションを指定しながら実行するにしても、それを実行する PowerShell ウィンドウがどうしても一瞬開いてしまう。

コレを回避する方法として、VBScript もしくは JScript を使用して、懐かしの WSH から PowerShell を起動する方法を紹介する。

Option Explicit

' 本ファイルと同じディレクトリにある「同じファイル名.ps1」を、ウィンドウを開かずサイレント実行する
Dim psFilePath : psFilePath = Replace(WScript.ScriptFullName, ".vbs", ".ps1")

WScript.CreateObject("WScript.Shell").Run "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoLogo -File " & Chr(34) & psFilePath & Chr(34), 0

このようなラッパーの .vbs ファイルを作ってやり、コチラを実行する。

上のスクリプトは、example.ps1 といった PowerShell のファイルがあるディレクトリに、この VBScript ファイルを example.vbs と同名で配置してやると、自動的に example.ps1 へのフルパスを組み立てて実行できるようなコードにしてある。

変数 psFilePath の値を、固定で .ps1 ファイルへのフルパスを記述してやれば、この VBScript ファイルをどこに置いても、どんなファイル名にしても扱えるようになる。

psFilePath = "C:\PATH\TO\my-powershell-script.ps1"

やっていることは単純。

PS> powershell.exe -File "C:\PATH\TO\my-powershell-script.ps1"

コレを、WSH 経由で実行しているだけ。powershell.exe へのフルパスで書いているが、フルパスじゃなくても動く。また、-NoLogo を一応付けているが、別に付けなくても良い。Chr(34) はダブルクォート文字のこと。エスケープとか面倒なので確実に括るために Chr(34) と書いた。

WScirpt.ShellRun() メソッドの第2引数で 0 を指定していて、コレのおかげで powershell.exe のウィンドウを開くことなくスクリプトを実行している。

今回は指定していないが、Run() メソッドの第3引数に True を指定すると、同期的に実行してスクリプトの終了を待ってくれる。終了コードを VBScript 側で取得して何か後続処理をしたい時は知っておくと良いだろう。


久々に WSH 書いたなー。仕様なのか、セキュリティ対策なのか、PowerShell 自体をひっそり動かすことができないので、未だ VBScript が登場するという。w