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    
無料ブログはココログ

« renameコマンドのワイルドカードの怪? | トップページ | WScript.ShellのExec()で、コンソールアプリを非表示で実行するラッパー(その2) »

2008年8月23日 (土)

WScript.ShellのExec()で、コンソールアプリを非表示で実行するラッパー

WScript.ShellのExec()で、コンソールアプリを実行すると、コンソールウィンドウが表示されて、鬱陶しいですね。

そこで、コンソールウィンドウを非表示にする、コンソールアプリのラッパーをVBScriptで作ります。

HideExec.VBS

Option Explicit
Dim fso
Dim wStdIn
Dim wStdOut
Dim wStdErr
Dim TempPath
Dim pStdIn
Dim pStdOut
Dim pStdErr
Dim StdIn
Dim StdOut
Dim StdErr
Dim wShell
Dim Command
Dim arg

Set fso=CreateObject("Scripting.FileSystemObject")
Set wStdIn=fso.GetStandardStream(0)
Set wStdOut=fso.GetStandardStream(1)
Set wStdErr=fso.GetStandardStream(2)
TempPath=fso.GetSpecialFolder(2).Path
pStdIn=fso.BuildPath(TempPath,fso.GetTempName())
pStdOut=fso.BuildPath(TempPath,fso.GetTempName())
pStdErr=fso.BuildPath(TempPath,fso.GetTempName())
Set StdIn=fso.CreateTextFile(pStdIn)
Sub Try
Do While Not wStdIn.AtEndOfStream
  StdIn.Write wStdIn.Read(1)
Loop
End Sub
Sub Catch
On Error Resume Next
Try
End Sub
Catch
StdIn.Close
Set wShell=CreateObject("WScript.Shell")
Command=Array()
For Each arg In WScript.Arguments
  If InStr(arg," ") Then arg="""" & arg & """"
  ReDim Preserve Command(UBound(Command)+1)
  Command(UBound(Command))=arg
Next
Command=Join(Command)
Command=Replace(Command,"`","""")
Call CreateObject("WScript.Shell").Run("CMD.EXE /S /C <""" & pStdIn & """ "& Command & " 1>""" & pStdOut & """ 2>""" & pStdErr & """""",0,False)
Do While Not fso.FileExists(pStdOut)
  WScript.Sleep 1000
Loop
Set StdOut=fso.OpenTextFile(pStdOut)
Do While Not fso.FileExists(pStdErr)
  WScript.Sleep 1000
Loop
Set StdErr=fso.OpenTextFile(pStdErr)
Do
  Do While Not StdOut.AtEndOfStream
    On Error Resume Next
    wStdOut.Write StdOut.Read(1)
    On Error GoTo 0
  Loop
  Do While Not StdErr.AtEndOfStream
    On Error Resume Next
    wStdErr.Write StdErr.Read(1)
    On Error GoTo 0
  Loop
  If AtEndOfStream(pStdOut) And AtEndOfStream(pStdErr) And StdOut.AtEndOfStream And StdErr.AtEndOfStream Then Exit Do
  WScript.Sleep 1000
Loop
StdOut.Close
StdErr.Close
fso.DeleteFile(pStdIn)
fso.DeleteFile(pStdOut)
fso.DeleteFile(pStdErr)

Function AtEndOfStream(Path)
On Error Resume Next
Call fso.OpenTextFile(Path,8)
AtEndOfStream=CBool(Err.Number=0)
End Function

« renameコマンドのワイルドカードの怪? | トップページ | WScript.ShellのExec()で、コンソールアプリを非表示で実行するラッパー(その2) »