在VBA中从shell命令捕获输出值?

find这个functionhttp://www.cpearson.com/excel/ShellAndWait.aspx

但是也需要从shell输出中捕获输出。 任何代码build议?

您可以CreateProcess将应用程序redirect到一个pipe道,然后直接读取该pipe道。 http://pastebin.com/CszKUpNS

 dim resp as string resp = redirect("cmd","/c dir") resp = redirect("ipconfig","") 

根据Andrew Lessard的回答,这里有一个函数来运行一个命令并将输出作为一个string返回 –

 Public Function ShellRun(sCmd As String) As String 'Run a shell command, returning the output as a string' Dim oShell As Object Set oShell = CreateObject("WScript.Shell") 'run command' Dim oExec As Object Dim oOutput As Object Set oExec = oShell.Exec(sCmd) Set oOutput = oExec.StdOut 'handle the results as they are written to and read from the StdOut object' Dim s As String Dim sLine As String While Not oOutput.AtEndOfStream sLine = oOutput.ReadLine If sLine <> "" Then s = s & sLine & vbCrLf Wend ShellRun = s End Function 

用法:

 MsgBox ShellRun("dir c:\") 

您总是可以将shell输出redirect到一个文件,然后从文件读取输出。

 Sub StdOutTest() Dim objShell As Object Dim objWshScriptExec As Object Dim objStdOut As Object Dim rline As String Dim strline As String Set objShell = CreateObject("WScript.Shell") Set objWshScriptExec = objShell.Exec("c:\temp\batfile.bat") Set objStdOut = objWshScriptExec.StdOut While Not objStdOut.AtEndOfStream rline = objStdOut.ReadLine If rline <> "" Then strline = strline & vbCrLf & CStr(Now) & ":" & Chr(9) & rline ' you can handle the results as they are written to and subsequently read from the StdOut object Wend MsgBox strline 'batfile.bat 'ping 1.1.1.1 -n 1 -w 2000 > nul 'echo 2 'ping 1.1.1.1 -n 1 -w 2000 > nul 'echo 4 'ping 1.1.1.1 -n 1 -w 2000 > nul 'echo 6 'ping 1.1.1.1 -n 1 -w 2000 > nul 'echo 8 End Sub 

根据bburns.km的回答 ,我在呼叫期间添加了传递input(使用StdInput)给可执行文件。 以防有人绊倒这一点,并有相同的需求。

 ''' <summary> ''' Executes the given executable in a shell instance and returns the output produced ''' by it. If iStdInput is given, it is passed to the executable during execution. ''' Note: You must make sure to correctly enclose the executable path or any given ''' arguments in quotes if they contain spaces. ''' </summary> ''' <param name="iExecutablePath"> ''' The full path to the executable (and its parameters). This string is passed to the ''' shell unaltered, so be sure to enclose paths and parameters containing spaces ''' in quotes ("). ''' </param> ''' <param name="iStdInput"> ''' The (optional) input to pass to the executable. Default: Null ''' </param> Public Function ExecuteAndReturnStdOutput(ByVal iExecutablePath As String, _ Optional ByVal iStdInput As String = vbNullString) _ As String Dim strResult As String Dim oShell As WshShell Set oShell = New WshShell Dim oExec As WshExec Set oExec = oShell.Exec(iExecutablePath) If iStdInput <> vbNullString Then oExec.StdIn.Write iStdInput oExec.StdIn.Close ' Close input stream to prevent deadlock End If strResult = oExec.StdOut.ReadAll oExec.Terminate ExecuteAndReturnStdOutput = strResult End Function 

注意:您需要添加对Windows Script Host Object Model的引用,以便知道WshShellWshExec的types。
(要做到这一点,请到VBA IDE菜单栏中的Extras – > References 。)