Вы всегда будете получать вспышку окна с Exec()
. Вместо этого вы можете использовать Run()
, чтобы выполнить команду в скрытом окне. Но вы не можете напрямую захватить вывод команды Run()
. Вам придется перенаправить вывод во временный файл, который ваш VBScript мог бы открыть, прочитать и удалить.
Например:
With CreateObject("WScript.Shell")
' Pass 0 as the second parameter to hide the window...
.Run "cmd /c tasklist.exe > c:\out.txt", 0, True
End With
' Read the output and remove the file when done...
Dim strOutput
With CreateObject("Scripting.FileSystemObject")
strOutput = .OpenTextFile("c:\out.txt").ReadAll()
.DeleteFile "c:\out.txt"
End With
The FileSystemObject
класс имеет такие методы, как GetSpecialFolder()
, чтобы получить путь к папке Windows Temp и GetTempName()
для создания временного файла, который можно использовать вместо жесткого кодирования выходного файла, как я «Сделано выше.
Также обратите внимание, что вы можете использовать аргумент /FO CSV
с tasklist.exe
для создания CSV-файла, который должен упростить его синтаксический анализ.
И, наконец, : VBScript «родные» способы получить список запущенных процессов. Класс WMI Win32_Process
, например, может сделать это без необходимости Run/Exec
.
Edit:
Для полноты картины следует упомянуть, что ваш сценарий может Перезапуск себя в скрытом окне консоли, где вы можете запустить Exec()
молча. К сожалению, это скрытое окно консоли также скроет ваш результат от таких функций, как WScript.Echo()
. Кроме того, однако, вы, вероятно, не заметите различий, выполняющих ваш скрипт под cscript
против wscript
. Вот пример этого метода:
' If running under wscript.exe, relaunch under cscript.exe in a hidden window...
If InStr(1, WScript.FullName, "wscript.exe", vbTextCompare) > 0 Then
With CreateObject("WScript.Shell")
WScript.Quit .Run("cscript.exe """ & WScript.ScriptFullName & """", 0, True)
End With
End If
' "Real" start of script. We can run Exec() hidden now...
Dim strOutput
strOutput = CreateObject("WScript.Shell").Exec("tasklist.exe").StdOut.ReadAll()
' Need to use MsgBox() since WScript.Echo() is sent to hidden console window...
MsgBox strOutput
Конечно, если ваш скрипт ожидает параметры командной строки, те должны были бы быть направлены при перезапуске сценария, а также.
Edit 2:
Еще одна возможность заключается в том, чтобы использовать буфер обмена Windows. Вы можете подключить вывод своей команды к утилите clip.exe
. Затем извлеките текст через любое количество доступных COM-объектов, которые могут получить доступ к содержимому буфера обмена.Например:
' Using a hidden window, pipe the output of the command to the CLIP.EXE utility...
CreateObject("WScript.Shell").Run "cmd /c tasklist.exe | clip", 0, True
' Now read the clipboard text...
Dim strOutput
strOutput = CreateObject("htmlfile").ParentWindow.ClipboardData.GetData("text")
Подсказка: Для меня он работал только с 'cmd.exe/C ... 'вместо' cmd/C ... ' – Black
Трубопровод к команде CLIP отлично работает, спасибо. –