如何将输入重定向到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
只是简单地返回“找不到文件”错误。
然而,当我直接在命令行输入各种命令时,它们都能正常工作。
答案 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
将目录更改为相应的文件夹,或使用整个或相对路径限定文件名。