vbs как получить результат от команды командной строки

Я хочу получить результат простой команды из командной строки (cmd.exe) с помощью скрипта Windows (.vbs). Как это делается? Я не смог найти хороший/простой пример или объяснение. Для примера можно использовать команду "дата" или "время". Например:

enter image description here

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.