Set wshShell = WScript.CreateObject ("WSCript.Shell")
wshshell.run "runas ..."
結果を取得してMsgBoxに表示するにはどうすればよいですか
Runの代わりにWshShellオブジェクトのExecメソッドを使用することをお勧めします。次に、標準ストリームからコマンドラインの出力を読み取るだけです。これを試してください:
Const WshFinished = 1
Const WshFailed = 2
strCommand = "ping.exe 127.0.0.1"
Set WshShell = CreateObject("WScript.Shell")
Set WshShellExec = WshShell.Exec(strCommand)
Select Case WshShellExec.Status
Case WshFinished
strOutput = WshShellExec.StdOut.ReadAll
Case WshFailed
strOutput = WshShellExec.StdErr.ReadAll
End Select
WScript.StdOut.Write strOutput 'write results to the command line
WScript.Echo strOutput 'write results to default output
MsgBox strOutput 'write results in a message box
これは、WshShell.Exec
が非同期であるという問題を修正するNilpoの回答の修正バージョンです。シェルのステータスが実行されなくなるまでビジーループを実行してから、出力を確認します。コマンドライン引数-n 1
をより高い値に変更して、ping
にかかる時間を長くし、スクリプトが完了するまでの待機時間が長くなることを確認します。
(誰かが問題に対する真の非同期のイベントベースの解決策を持っているなら、私に知らせてください!)
Option Explicit
Const WshRunning = 0
Const WshFinished = 1
Const WshFailed = 2
Dim Shell : Set Shell = CreateObject("WScript.Shell")
Dim exec : Set exec = Shell.Exec("ping.exe 127.0.0.1 -n 1 -w 500")
While exec.Status = WshRunning
WScript.Sleep 50
Wend
Dim output
If exec.Status = WshFailed Then
output = exec.StdErr.ReadAll
Else
output = exec.StdOut.ReadAll
End If
WScript.Echo output
Exec.Statusがエラーレベルを返さないため、BoffinBrainのソリューションはまだ機能しません(実行中は0を返し、終了時には1を返します)。そのためには、exec.ExitCodeを使用する必要があります(Exec()メソッドを使用して実行されるスクリプトまたはプログラムによって設定された終了コードを返します)。したがって、ソリューションはに変わります
Option Explicit
Const WshRunning = 0
' Const WshPassed = 0 ' this line is useless now
Const WshFailed = 1
Dim Shell : Set Shell = CreateObject("WScript.Shell")
Dim exec : Set exec = Shell.Exec("ping.exe 127.0.0.1 -n 1 -w 500")
While exec.Status = WshRunning
WScript.Sleep 50
Wend
Dim output
If exec.ExitCode = WshFailed Then
output = exec.StdErr.ReadAll
Else
output = exec.StdOut.ReadAll
End If
WScript.Echo output