Перенаправление ввода в исполняемый файл из Excel VBA - PullRequest
1 голос
/ 07 декабря 2009

Как перенаправить ввод в исполняемый файл из 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 ]

4 голосов
/ 07 декабря 2009

Выполнить команду следующим образом:

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

Таким образом, он будет запускаться через интерпретатор командной строки.

3 голосов
/ 14 декабря 2009

Мне стало известно об этом решении: нет необходимости записывать ввод в 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 голосов
/ 03 июля 2015

Я отвечу на более общую часть вашего вопроса. Вы спросили:

В частности, почему код ниже не работает?

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

Причина, по которой код работает не так, как вы ожидаете, заключается в том, что оболочка WScript.Shell отличается от оболочки cmd.exe. В частности, это не делает перенаправления или каналы .

Если бы вы смогли отладить процесс runme, вы бы увидели, что ему были переданы два аргумента, < и start.txt

Как уже было сказано ранее, это можно исправить двумя способами:

  • напрямую подайте WScript.Shell StdIn и удалите ваше перенаправление

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

  • запустить оболочку DOS вместо runme, чтобы она интерпретировала остальную часть командной строки, включая перенаправление

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

0 голосов
/ 07 декабря 2009

Возможно, вы отправляете в папку, отличную от ожидаемой.

Возможно, вам придется изменить каталог с помощью CHDIR на соответствующую папку или указать имена файлов, используя полный или относительный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...