vbs как получить результат от команды командной строки
Я хочу получить результат простой команды из командной строки (cmd.exe) с помощью скрипта Windows (.vbs). Как это делается? Я не смог найти хороший/простой пример или объяснение. Для примера можно использовать команду "дата" или "время". Например:
P. S. Я в состоянии написать код скрипта, который открывает УМК.exe и отправляет команды.
спасибо!
1 ответов
когда вы сомневаетесь, прочитайте документация. Вы, вероятно, хотите что-то вроде этого:
Set p = CreateObject("WScript.Shell").Exec("%COMSPEC% /c date /t")
Do While p.Status = 0
WScript.Sleep 100
Loop
WScript.Echo p.StdOut.ReadAll
Edit: при использовании Exec()
вы передаете вход через .StdIn
дескриптор, а не через SendKeys()
(что в любом случае является довольно ненадежным способом передачи ввода).
%COMSPEC%
является системной переменной среды с полным путем к cmd.exe
и делает cmd.exe
выход после команды (date /t
в пример) закончен.
если команда указывает на успех/неудача с кодом выхода, вы можете проверить ExitCode
свойство после завершения команды.
If p.Status <> 0 Then WScript.Echo p.ExitCode
Edit2: вместо atprogram
в интерактивном режиме вы можете создавать командные строки, которые будут выполнять определенные задачи без взаимодействия с пользователем? С неинтерактивными командными строками что-то вроде этого может работать:
prompt = "C:\>"
atprogram_cmdline_1 = "atprogram.exe ..."
atprogram_cmdline_2 = "atprogram.exe ..."
'...
Function ReadOutput(p)
text = ""
Do Until Right(text, Len(prompt)) = prompt
text = text & p.StdOut.Read(1)
Loop
ReadOutput = text
End Function
Set cmd = CreateObject("WScript.Shell").Exec("%COMSPEC% /k")
ReadOutput cmd ' skip over first prompt
cmd.StdIn.WriteLine(atprogram_cmdline_1)
WScript.Echo ReadOutput(cmd)
cmd.StdIn.WriteLine(atprogram_cmdline_2)
WScript.Echo ReadOutput(cmd)
'...
cmd.Terminate ' exit CMD.EXE
%COMSPEC% /k
запускает команду запрос без выполнения команды. The /k
предотвращает его от закрытия. Поскольку он не закрывается автоматически, вы не можете использовать While p.Status = 0
петли здесь. Если команде требуется некоторое время для завершения, вам нужно WScript.Sleep
несколько секунд.
Via cmd.StdIn.WriteLine
вы можете запускать командные строки в CMD
экземпляра. Функция ReadOutput()
считывает вывод из StdOut
пока не появится следующее приглашение. Вам нужно искать приглашение, потому что операции чтения блокируются, поэтому вы не можете просто скажите: "прочтите все, что уже напечатано".
после того, как вы закончите, вы бросите CMD.EXE
via cmd.Terminate
.