2017年9月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
無料ブログはココログ

« PowerShellの.PS1ファイルを起動する。 | トップページ | 画面全体やアクティブウィンドウのスナップショットを取得する。(その2) »

2007年7月31日 (火)

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" %*
のようにします。

« PowerShellの.PS1ファイルを起動する。 | トップページ | 画面全体やアクティブウィンドウのスナップショットを取得する。(その2) »