VBScriptで、Windowsコマンド(コマンドプロンプトのコマンド)を実行した時の戻り値を取得する方法についての注意事項を説明しています。
はじめに
本記事では、WshShellの「Run」メソッドを使用して、Windowsのコマンドを実行した場合に、コマンドの戻り値が正しく取得出来ない事象が発生したため、戻り値が正しく取得出来たパターンと出来なかったパターンを比べつつ、どのようにすれば正しく取得出来るか見ていきたいと思います。
ここでは、WshShell.Runメソッドの使用方法については触れません。
詳しく知りたい方は、下記の記事を参考にして下さい。
戻り値が正しく取得されないパターン
まず、取得出来ないパターンを見ていきたいと思います。
こちらは、存在しない宛先に対して、pingを実行しています。
>コマンド:ping -n 1 8.8.8.99
この場合、pingが失敗しているため、戻り値は「1」となるはずが、「0」が表示されます。
Option Explicit
' Windowsのコマンド
Const cmd = "ping -n 1 8.8.8.99"
' 戻り値を格納する変数
Dim rc
rc = 0
' WSHオブジェクトの作成
Dim objShell
Set objShell = CreateObject("WScript.Shell")
' Windowsコマンドの実行
rc = objShell.Run("cmd /c " & cmd, 0)
' 戻り値の表示
WScript.Echo "戻り値:" & rc
' WSHオブジェクトの破棄
Set objShell = Nothing
戻り値が正しく取得されるパターン
次に、正しく取得するパターンになります。
こちらも同じく、存在しない宛先に対して、pingを実行しています。
>コマンド:ping -n 1 8.8.8.99
こちらは、pingが失敗しているため、戻り値は想定通り「1」となっています。
Option Explicit
' Windowsのコマンド
Const cmd = "ping -n 1 8.8.8.99"
' 戻り値を格納する変数
Dim rc
rc = 0
' WSHオブジェクトの作成
Dim objShell
Set objShell = CreateObject("WScript.Shell")
' Windowsコマンドの実行
rc = objShell.Run("cmd /c " & cmd, 0, True)
' 戻り値の表示
WScript.Echo "戻り値:" & rc
' WSHオブジェクトの破棄
Set objShell = Nothing
結論
前項では似たようなソースコードで、pingを実行し、異なる戻り値が表示されることを確認しました。
では、何故異なる戻り値が返ってきているのかについて説明したいと思います。
まず、ポイントとなるのが、ソースコードの15行目になります。
- 正しく取得されない:rc = objShell.Run(“cmd /c ” & cmd, 0)
- 正しく取得される :rc = objShell.Run(“cmd /c ” & cmd, 0, True)
上記の赤字部分(Runメソッドの第3引数)が、TrueかFalseかで挙動が変わっているようです。
*既定値は「False」なので、省略時は「False」として扱われる。
赤字部分の引数についてですが、コマンドの実行を同期[True]して実行するか、非同期[False]で実行するかを指定しています。
上記を踏まえて、正しく取得されない方(非同期でコマンドを実行する)を実行すると、確かにコマンドの終了前に戻り値が表示されているように見えます。
以上から、若干憶測が入りますが、非同期でコマンドを実行した場合は、コマンドの実行結果が正しく取得出来ないようです。(コマンドの実行が完了するまで待たないので当然かもしれませんが)
なので、実行結果を取得したい場合は、コマンドを同期実行する必要があります。
コメント