PowerShellの.PS1ファイルをウィンドウ アプリっぽく実行する。
WSHホストには、コンソール バージョンとウィンドウ バージョンがありますが、
PowerShellには、バッチファイルと同じで、コンソール バージョンしかありません。
そこで、.PS1ファイルをウィンドウ アプリっぽく実行します。
WPowerShell.WSF PS1ファイル [引数...]
<package>
<job>
<script language=vbscript>
Dim Args
Dim Arg
Args=Array("CScript.exe //job:exec",""""&WScript.ScriptFullName&"""")
For Each Arg In WScript.Arguments
ReDim Preserve Args(UBound(Args)+1)
Args(UBound(Args))=""""&Arg&""""
Next
WScript.Quit CreateObject("WScript.Shell").Run(Join(Args),7,True)
</script>
</job>
<job id=exec>
<script language=vbscript>
Dim oExec
Dim Args
Dim Arg
Dim k
Dim StdErr
Dim StdOut
Args=Array("powershell.exe -NonInteractive -command ""&")
For k=0 To WScript.Arguments.Count()-1
Arg=WScript.Arguments.Item(k)
If k=0 Then If InStr(Arg,"\")=0 Then Arg=".\"&Arg
ReDim Preserve Args(UBound(Args)+1)
If InStr(Arg," ") Then
Args(UBound(Args))="'"&Arg&"'"
Else
Args(UBound(Args))=Arg
End If
Next
Args=Join(Args)&""""
Set oExec=CreateObject("WScript.Shell").Exec(Args)
oExec.StdIn.Close
StdErr=oExec.StdErr.ReadAll()
StdOut=oExec.StdOut.ReadAll()
If StdErr<>"" Then MsgBox Join(Array(Args,Empty,StdErr),vbLf),vbCritical,WScript.ScriptName&" - StdErr"
If StdOut<>"" Then MsgBox Join(Array(Args,Empty,StdOut),vbLf),vbInformation,WScript.ScriptName&" - StdOut"
WScript.Quit oExec.ExitCode
</script>
</job>
</package>
一応、標準出力と標準エラーは、もしあれば、MsgBoxでウィンドウ表示しますが、
量が多いと、Exec()のパイプが詰まってハングアップしたり、
MsgBox()で表示しきれないので、あまり出さないようにしてください。
コンソールウィンドウは非表示でもよいのですが、念のため、非アクティブな
最小化ウィンドウにしています。Run(,7,)をRun(,0,)に変えれば、非表示です。
これを.PS1ファイルの関連付けに指定するときは、
WScript.exe "フルパス\WPowerShell.WSF" "%1" %*
のようにします。