2022年5月
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 31        
無料ブログはココログ

« バッチファイルなどをショートカットで非表示実行する。 | トップページ | バッチファイルで作るtail -fコマンド »

2007年5月11日 (金)

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

WScript.ShellのExec()でコンソールアプリを実行すると、
コンソールウィンドウが表示されます。それを非表示にする方法です。

コンソールウィンドウがない環境、つまり、WScript.exeからExec()で
コンソールアプリを起動すると、コンソールウィンドウが生成されます。

コンソールウィンドウがある環境、つまり、CScript.exeからExec()で
コンソールアプリを起動すると、コンソールウィンドウは生成されません。

これを利用すれば、Exec()でコンソールアプリを非表示で実行できます。

つまり、WScript.exeからRun()で、CScript.exeを非表示で起動し、
その中からExec()でコンソールアプリを起動すればよいのです。

基本的にはRun()するスクリプトとExec()するスクリプトの二つが必要ですが、
WSFでひとつのファイルにしたり、再帰呼び出しで一本化することもできます。

以下のWSFは、そういうサンプルです。

<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),0,True)
</script>
</job>
<job id=exec>
<script language=vbscript>
Dim wShell
Dim oExec
Dim Args
Dim Arg
Args=Array("fc.exe")
For Each Arg In WScript.Arguments
  If InStr(Arg," ") Then Arg="""" & Arg & """"
  ReDim Preserve Args(UBound(Args)+1)
  Args(UBound(Args))=Arg
Next
Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec(Join(Args))
MsgBox oExec.StdErr.ReadAll() & vbLf & oExec.StdOut.ReadAll(),,Join(Args)
</script>
</job>
</package>

fc.exeの代わりにfc.wsfで試してみてください。

« バッチファイルなどをショートカットで非表示実行する。 | トップページ | バッチファイルで作るtail -fコマンド »