将输入重定向到Excel VBA中的可执行文件

时间:2009-12-07 15:08:00

标签: excel-vba vba redirect excel

如何将输入重定向到VBA内的可执行文件?具体来说,为什么下面的代码不起作用?

ChDir theRightDirectory
Set WshShell = VBA.CreateObject("WScript.Shell") 
WshShell.Run "runme < start.txt", 1, True

RetVal = Shell("runme < start.txt", vbNormalFocus)  

runme.exe确实启动,但输入未重定向,必须在命令窗口中手动输入。还尝试过:

RetVal = Shell("type start.txt | runme.exe", vbNormalFocus)

type start.txt的输出管道输入runme.exe只是简单地返回“找不到文件”错误。

然而,当我直接在命令行输入各种命令时,它们都能正常工作。

4 个答案:

答案 0 :(得分:4)

以这种方式执行命令:

WshShell.Run "%COMSPEC% /C runme < start.txt", 1, True

这样它将通过命令行解释器运行它。

答案 1 :(得分:3)

我已经意识到这个解决方案:无需将输入写入start.txt;输入可以直接输入到输入流。 (我的问题应该明确指出这也是一种选择。)奖励是用户可以从输出流中获得反馈。

Set WshShell = VBA.CreateObject("WScript.Shell")
WshShell.CurrentDirectory = theRightDirectory
Set oExec = WshShell.exec("runme.exe")

' Write to the input stream
oExec.StdIn.Write "some input for the first prompt" & vbCrLf & _
                  "some more input" & vbCrLf 

' The output stream can be shown to the user, e.g.
sOutput = oExec.StdOut.ReadAll()
MsgBox (sOutput)

答案 2 :(得分:2)

我会回答你问题的更一般部分。你问:

  

具体来说,为什么下面的代码不起作用?

  WshShell.Run "runme < start.txt", 1, True

代码无法正常工作的原因是因为WScript.Shell的shell与cmd.exe的shell不同。特别是,它不会重定向或管道

如果你能够调试runme过程,你会发现它已经传递了两个参数,<start.txt

如前所述,有两种解决方法:

  • 直接提供WScript.Shell StdIn并删除重定向

    set oExec = WshShell.exec(cmdLine)
    oExec.StdIn.Write "some input for the first prompt" & vbCrLf

  • 运行DOS shell而不是runme,让它解释命令行的其余部分,包括重定向

    WshShell.Run "%COMSPEC% /C runme < start.txt", 1, True

答案 3 :(得分:0)

你可能正在炮轰到一个不同于你期望的文件夹。

您可能需要使用CHDIR将目录更改为相应的文件夹,或使用整个或相对路径限定文件名。