連携 リダイレクトを使わず直接コマンドの実行結果を取得する

※より実装に近く表示させる為、コードの改行を避けています。スマホ等で閲覧される際は向きを変えてご覧ください。

※実装するバージョンによってはバージョンアップの仕様により動作しないコードもあります。実装には動作確認の上ご使用下さい。

Option Explicit


Function CMDcommandResultGet(strCommand As StringAs String
'********************************************************
'リダイレクトを使わず直接コマンドの実行結果を取得する①
'********************************************************
'Windows Scripting Host(WSH)-WshShell-Execメソッド
'Functionで全ての値を取得(StdOut/stderr)
Dim WshShell As Object
Dim oExec As Object

Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("%ComSpec% /c " & strCommand) 'Exec メソッド

If Not oExec.StdOut.AtEndOfStream Then 'StdOut プロパティ'AtEndOfStream プロパティ
     CMDcommandResultGet = oExec.StdOut.ReadAll 'ReadAll メソッド
     Exit Function
End If

If Not oExec.stderr.AtEndOfStream Then 'stderr プロパティ'AtEndOfStream プロパティ
     CMDcommandResultGet = oExec.stderr.ReadAll 'ReadAll メソッド
     Exit Function
End If

End Function


Sub CommandResultGet(ByVal strCommand As StringByRef blnERR As Boolean, _
ByRef strRead As String)
'********************************************************
'リダイレクトを使わず直接コマンドの実行結果を取得する②
'********************************************************
'Windows Scripting Host(WSH)-WshShell-Execメソッド
'Call-Subでエラー値も取得(StdOut/stderr)

'strCommandはコマンド引数
'blnERRはエラー値で無い場合FALSEを返す
'strReadは値を返す

Dim WshShell As Object
Dim oExec As Object

Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("%ComSpec% /c " & strCommand) 'Exec メソッド

If Not oExec.StdOut.AtEndOfStream Then 'StdOut プロパティ'AtEndOfStream プロパティ
     strRead = oExec.StdOut.ReadAll 'ReadAll メソッド
     blnERR = False '返値
     Exit Sub
End If

If Not oExec.stderr.AtEndOfStream Then 'stderr プロパティ'AtEndOfStream プロパティ
     strRead = oExec.stderr.ReadAll 'ReadAll メソッド
     blnERR = True '返値
     Exit Sub
End If

End Sub


Private Sub test1() '①
Dim strCommand As String

strCommand = "ver"

    MsgBox CMDcommandResultGet(strCommand)
    Debug.Print CMDcommandResultGet(strCommand)

End Sub


Private Sub test2() '②

Dim blnERR As Boolean
Dim strRead As String
Dim strCommand As String

strCommand = "ver"

Call CommandResultGet(strCommand, blnERR, strRead)

If blnERR = False Then
    MsgBox strRead, vbInformation, "OK"
Else
    MsgBox strRead, vbCritical, "ERROR"
End If

Debug.Print strRead

End Sub

Windows Script Host
Exec メソッド
子コマンドシェルでアプリケーションを実行します。アプリケーションから StdIn/StdOut/StdErr ストリームにアクセスできます。
  • 構文
  • object.Exec(strCommand)
  • 引数
  • object
    • WshShell オブジェクトです。
  • strCommand
    • スクリプトの実行に使用するコマンド ラインを示す文字列値です。コマンド プロンプトから入力する場合と全く同じコマンド ラインを指定します。
  • 解説
  • Exec メソッドが返す WshScriptExec オブジェクトを使用すると、Exec メソッドを使って実行したスクリプトのステータス情報やエラー情報だけでなく、StdIn、StdOut、および StdErr チャンネルにもアクセスできます。Exec メソッドで実行できるのは、コマンド ラインのアプリケーションのみです。Exec メソッドを使ってリモートのスクリプトを実行することはできません。Exec メソッドを (WshRemote オブジェクトの) Execute メソッドと混同しないように注意してください。
Windows Script Host
StdOut プロパティ (WshScriptExec)
Exec オブジェクトの書き込み専用の stdout 出力ストリームを公開します。
  • 構文
  • Object.StdOut
  • 引数
  • Object
    • WshScriptExec オブジェクトです。
  • 解説
  • StdOut プロパティには、スクリプトから標準出力に送信された全情報のコピー (読み取り専用) が格納されます。
Windows Script Host
StdErr プロパティ(WshScriptExec)
Exec オブジェクトの stderr 出力ストリームへのアクセスを提供します。
  • 構文
  • Object.StdErr
  • 引数
  • Object
    • WshScriptExec オブジェクトです。
  • 解説
  • Exec で起動されたプロセスから stderr ストリームに送信されたデータを取得する場合に
    StdErr プロパティを使用します。
Windows Script Host
AtEndOfStream プロパティ
入力ストリームの最後に達したかどうかを示すブール値を返します。
  • 構文
  • object.AtEndOfStream
  • 引数
  • Object
    • StdIn テキスト ストリーム オブジェクトです。
  • 解説
  • AtEndOfStream プロパティには、入力ストリームの最後に達したかどうかを示すブール値が格納されます。AtEndOfStream プロパティは、ストリーム ポインタが入力ストリームの最後を指している場合は True を返し、それ以外の場合は Falseを返します。StdIn、StdOut、および StdErr のプロパティとメソッドは、スクリプトを CScript.exe で実行した場合にのみ動作します。WScript.exe を使ってスクリプトを実行すると、エラーが発生します。
Windows Script Host
ReadAll メソッド
入力ストリーム全体を読み込み、結果の文字列を返します。
  • 構文
  • object.ReadAll
  • 引数
  • Object
    • StdIn テキスト ストリーム オブジェクトです。
  • 解説
  • ReadAll は文字列を返します。StdIn プロパティ、StdOut プロパティ、および StdErrプロパティとメソッドは、スクリプトを CScript.exe で実行した場合にのみ動作します。WScript.exe でスクリプトを実行すると、"無効なハンドルです。" というエラーが発生します。

 

 

 

2000年01月01日|[VBサンプルコード]:[連携]