Se encontró esta función http://www.cpearson.com/excel/ShellAndWait.aspx¿Captura el valor de salida de un comando de shell en VBA?
Pero también sería necesario capturar la salida de la salida del shell. Cualquier sugerencia de código?
Se encontró esta función http://www.cpearson.com/excel/ShellAndWait.aspx¿Captura el valor de salida de un comando de shell en VBA?
Pero también sería necesario capturar la salida de la salida del shell. Cualquier sugerencia de código?
Puede CreateProcess
redirigir su aplicación StdOut
a una tubería, luego lea esa tubería directamente; http://pastebin.com/CszKUpNS
dim resp as string
resp = redirect("cmd","/c dir")
resp = redirect("ipconfig","")
Siempre se puede redirigir la salida del shell a un archivo, luego leer el resultado del archivo.
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
Sobre la base de la respuesta de Andrew Lessard, he aquí una función para ejecutar un comando y devolver la salida como una cadena -
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
Uso:
MsgBox ShellRun("dir c:\")
Acredité esta gran respuesta tuya en una reciente [publicación de Python] (http://stackoverflow.com/questions/39516875/return-result-from-python-to-vba/39517658#39517658). Siéntase libre de responderlo directamente y eliminaré el mío. – Parfait
No pude hacer que funcione con tu ejemplo. Necesitaba 'ShellRun (" cmd.exe/c dir c: \ ")' en su lugar. Entonces funcionó perfectamente. Gracias. – mal
no necesita el bucle while aquí, puede reemplazar desde la línea 'Set oOutput = oExec.StdOut' hasta el final de la función con esta línea:' ShellRun = oExec.StdOut.ReadAll' –
Basado en bburns.km's answer, agregué el paso de entrada t (usando StdInput) al ejecutable durante la llamada. Solo en caso de que alguien se tropiece con esto y tenga la misma necesidad.
''' <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
Note: You will need to add a reference to
Windows Script Host Object Model
so the typesWshShell
andWshExec
are known.
(To do this go to Extras ->References in the VBA IDE's menu bar.)
Wow no podría haber creado este mismo gracias :) – user310291
Lo sentimos, pero ¿cómo obtener su código se ejecute? Estoy tratando de hacer algo similar (extraer los datos de stdout en VBA, y estoy ejecutando en OSX) y no estoy seguro de dónde declarar sus funciones. Intenté ponerlos en la misma carpeta que define la funcionalidad de mis formularios de usuario cuando hacen clic en enviar, pero me dio un error que decía "Error de compilación: solo pueden aparecer comentarios después de End Sub, End Function o End Property". – Engineero
Este es un código específico de Windows ya que usa la API de Windows; no se ejecutará en OSX sin importar lo que haga, es mejor hacer una nueva pregunta. –