PowerShell のウィンドウを一切表示させずに実行する
こんなネタは今まで紹介したことなかったっけ?
PowerShell のスクリプトファイル .ps1
を実行する際、どうしても PowerShell のウィンドウが開いてしまって鬱陶しい。
-WindowStyle Hidden
というオプションを指定しながら実行するにしても、それを実行する PowerShell ウィンドウがどうしても一瞬開いてしまう。
コレを回避する方法として、VBScript もしくは JScript を使用して、懐かしの WSH から PowerShell を起動する方法を紹介する。
- VBScript にて記述
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.Shell
の Run()
メソッドの第2引数で 0
を指定していて、コレのおかげで powershell.exe
のウィンドウを開くことなくスクリプトを実行している。
今回は指定していないが、Run()
メソッドの第3引数に True
を指定すると、同期的に実行してスクリプトの終了を待ってくれる。終了コードを VBScript 側で取得して何か後続処理をしたい時は知っておくと良いだろう。
久々に WSH 書いたなー。仕様なのか、セキュリティ対策なのか、PowerShell 自体をひっそり動かすことができないので、未だ VBScript が登場するという。w
- PowerShell/スクリプト/タスクスケジュール実行時にウィンドウを隠す - yanor.net/wiki
- How to run a PowerShell script without displaying a window? - Stack Overflow
- PowerShell起動時にHiddenを指定しても一瞬ウィンドウが表示されてしまう
- WSH/外部コマンドを実行する方法・Runメソッド - Windowsと暮らす
- 別のVBScriptファイルを実行する方法 VBScript : バヤシタ