2017年11月
      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スクリプトファイル(.JS) | トップページ | PowerShell.exeで日本語なども通るSendKeysの1行バッチファイル »

2007年8月27日 (月)

PowerShellスクリプトをWSFファイルにして、ウィンドウ アプリっぽく実行する。

WSHホストには、コンソール バージョンとウィンドウ バージョンがありますが、
PowerShellには、バッチファイルと同じで、コンソール バージョンしかありません。
そこで、以下のように、PowerShellスクリプトをWSFファイルに組み込んで、ウィンドウ アプリっぽく実行します。

<package>
<job>
<script language=vbscript>
Dim wShell
ReDim Args(WScript.Arguments.Count-1)
For k=0 To WScript.Arguments.Count-1
  Args(k)="""" & WScript.Arguments.Item(k) & """"
Next
Set wShell=CreateObject("WScript.Shell")
wShell.Environment("PROCESS").Item("args")=Join(Args,vbTab)
wShell.Environment("PROCESS").Item("arg0")=WScript.ScriptFullName
WScript.Quit CreateObject("WScript.Shell").Run("CScript.exe //job:exec """ & WScript.ScriptFullName & """",7,True)
</script>
</job>
<job id=exec>
<script language=vbscript>
Dim oExec
Dim StdErr
Dim StdOut
Set oExec=CreateObject("WScript.Shell").Exec("powershell.exe -NonInteractive -command ""& {$s=get-content $env:arg0;$s=$s[([Array]::LastIndexOf($s,'<![CDATA[')+1)..($s.length-1)]+'';$s='function main {'+[String]::Join([char]13+[char]10,$s)+'}main '+$env:args;invoke-expression $s;}""")
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>
<resource>
<![CDATA[
  $args.gettype()
  $args.length
  $args
#]]></resource></job></package>

これをダブルクリックなどで起動します。ドロップなどで引数も渡せます。
ExecutionPolicyがRestrictedのままでも、実行できます。

上では、最小化(7)にしています。非表示ならRun(,0)に変えてください。

一応、標準出力と標準エラーは、もしあれば、MsgBoxでウィンドウ表示しますが、
量が多いと、Exec()のパイプが詰まってハングアップしたり、
MsgBox()で表示しきれないので、あまり出さないようにしてください。

« 最小化や非表示で実行されるPowerShellスクリプトファイル(.JS) | トップページ | PowerShell.exeで日本語なども通るSendKeysの1行バッチファイル »