2012年11月24日土曜日

[Script][VBS]コマンド実行(WSHShell.Exec)

WSHShell の Exec メソッドを利用すると実行したプログラムの標準出力を編集に取得することができる。

プログラム(ipconfig)を実行し、標準出力を取得する Set WshShell = CreateObject("WScript.Shell")

'プログラムを実行
Set objExec = WshShell.Exec("ipconfig.exe")

'Set objExec = WshShell.Exec("netstat -n")
'Set objExec = WshShell.Exec("cmd.exe /c tree /f")


'プログラムが終了するまで待機
While objExec.Status = 0
  WScript.Sleep 100
Wend

'標準出力を取得
strLineData = objExec.StdOut.ReadAll

'結果を表示
WScript.Echo strLineData

Set objExec = Nothing
Set objWshShell = Nothing

ipconfig の実行結果を StdOut.ReadAll で変数に読みとっています。
WshShellオブジェクトのExec メソッドの引数は .exe を記載しなくても実行します。(例:"netstat -n")
tree コマンドは実行ファイルではなく、コマンドシェルの1コマンドなので、cmd.exe の引数に入れて実行する必要があります。

このやり方だと、cmd.exe を引数なしで呼び出した場合うまくいかないです。WshShell.Exec("cmd.exe")と書いて実行すると、真っ黒な画面が出て[×]の終了ボタンを押さないと閉じることもできなくなります。
これは次の様な理由です。
標準入力は objExec.StdIn が担うので、キー入力しても cmd.exe へは文字列は送られません。
標準出力は objExec.StdOut が担うので、出力があるコマンドを実行しても画面に文字列は表示されません。

次を見れば理由が分かると思います。

cmd.exeを実行し、コマンドの処理結果を標準出力(StdOut)から取得する 'Exec メソッドの戻り値は、WshScriptExec オブジェクトだよ。

Set WshShell = CreateObject("WScript.Shell")

'プログラムを実行

Set objExec = WshShell.Exec("cmd.exe")
objExec.StdIn.WriteLine "dir"
objExec.StdIn.WriteLine "exit"

'プログラムが終了するまで待機
While objExec.Status = 0
  WScript.Sleep 100
Wend

'標準出力を取得
strLineData = objExec.StdOut.ReadAll

'結果を表示
WScript.Echo strLineData

Set objExec = Nothing
Set objWshShell = Nothing

dir コマンドを StdIn に送って実行し、そしてその次に exit コマンドを StdIn に送って cmd.exe を終了しています。
その後 StdOut を取得して画面表示させています。


Script のページに戻る

0 件のコメント:

コメントを投稿