Запуск командной строки молча с помощью VbScript и получение вывода?
Я хочу иметь возможность запускать программу через командную строку, и я хочу начать ее с VbScript. Я также хочу получить выход из командной строки и назначить ее переменной, и я хочу, чтобы все это было сделано без каких-либо всплывающих окон. Я обошёл две вещи отдельно, но не вместе. Вот что я получил до сих пор.
Запустите команду из cmd и получите вывод:
Dim WshShell, oExec
Set WshShell = WScript.CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("C:\snmpget -c public -v 2c 10.1.1.2 .1.3.6.1.4.1.6798.3.1.1.1.5.1")
x = oExec.StdOut.ReadLine
Wscript.Echo x
Вышеупомянутый script работает и делает то, что я хочу, за исключением того, что cmd появляется на короткое время.
Здесь script, который будет запускаться беззвучно, но не будет захватывать выходные данные
Set WshShell = WScript.CreateObject("WScript.Shell")
Return = WshShell.Run("C:\snmpset -c public -v 2c -t 0 10.1.1.2 .1.3.6.1.4.1.6798.3.1.1.1.7.1 i 1", 0, true)
Есть ли способ заставить этих двух работать вместе?
Позвольте мне рассказать вам, почему я хочу сделать это. Я в основном опросил блок каждые 5-10 минут, и я собираюсь отправить script по электронной почте или бросить окно с сообщением, когда возникает определенное условие, но я не хочу видеть, что линия cmd всплывает весь день на моем компьютер. Какие-либо предложения?
Благодаря
Ответы
Ответ 1
Вы можете перенаправить вывод в файл, а затем прочитать файл:
return = WshShell.Run("cmd /c C:\snmpset -c ... > c:\temp\output.txt", 0, true)
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile("c:\temp\output.txt", 1)
text = file.ReadAll
file.Close
Ответ 2
Я принял этот и другие комментарии и создал более сложную функцию для запуска приложения и получения вывода.
Пример для функции вызова: выведет список DIR списка C:\только для каталогов. Результат будет возвращен переменной CommandResults, а также останется в C:\OUTPUT.TXT.
CommandResults = vFn_Sys_Run_CommandOutput("CMD.EXE /C DIR C:\ /AD",1,1,"C:\OUTPUT.TXT",0,1)
Функция
Function vFn_Sys_Run_CommandOutput (Command, Wait, Show, OutToFile, DeleteOutput, NoQuotes)
'Run Command similar to the command prompt, for Wait use 1 or 0. Output returned and
'stored in a file.
'Command = The command line instruction you wish to run.
'Wait = 1/0; 1 will wait for the command to finish before continuing.
'Show = 1/0; 1 will show for the command window.
'OutToFile = The file you wish to have the output recorded to.
'DeleteOutput = 1/0; 1 deletes the output file. Output is still returned to variable.
'NoQuotes = 1/0; 1 will skip wrapping the command with quotes, some commands wont work
' if you wrap them in quotes.
'----------------------------------------------------------------------------------------
On Error Resume Next
'On Error Goto 0
Set f_objShell = CreateObject("Wscript.Shell")
Set f_objFso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1, ForWriting = 2, ForAppending = 8
'VARIABLES
If OutToFile = "" Then OutToFile = "TEMP.TXT"
tCommand = Command
If Left(Command,1)<>"""" And NoQuotes <> 1 Then tCommand = """" & Command & """"
tOutToFile = OutToFile
If Left(OutToFile,1)<>"""" Then tOutToFile = """" & OutToFile & """"
If Wait = 1 Then tWait = True
If Wait <> 1 Then tWait = False
If Show = 1 Then tShow = 1
If Show <> 1 Then tShow = 0
'RUN PROGRAM
f_objShell.Run tCommand & ">" & tOutToFile, tShow, tWait
'READ OUTPUT FOR RETURN
Set f_objFile = f_objFso.OpenTextFile(OutToFile, 1)
tMyOutput = f_objFile.ReadAll
f_objFile.Close
Set f_objFile = Nothing
'DELETE FILE AND FINISH FUNCTION
If DeleteOutput = 1 Then
Set f_objFile = f_objFso.GetFile(OutToFile)
f_objFile.Delete
Set f_objFile = Nothing
End If
vFn_Sys_Run_CommandOutput = tMyOutput
If Err.Number <> 0 Then vFn_Sys_Run_CommandOutput = "<0>"
Err.Clear
On Error Goto 0
Set f_objFile = Nothing
Set f_objShell = Nothing
End Function
Ответ 3
@Mark Cidade
Спасибо, Марк! Это решило несколько дней исследований о том, как я должен это назвать из PHP WshShell. Поэтому, благодаря вашему коду, я понял...
function __exec($tmppath, $cmd)
{
$WshShell = new COM("WScript.Shell");
$tmpf = rand(1000, 9999).".tmp"; // Temp file
$tmpfp = $tmppath.'/'.$tmpf; // Full path to tmp file
$oExec = $WshShell->Run("cmd /c $cmd -c ... > ".$tmpfp, 0, true);
// return $oExec == 0 ? true : false; // Return True False after exec
return $tmpf;
}
Это то, что сработало для меня в моем случае. Не стесняйтесь использовать и изменять в соответствии с вашими потребностями. Вы всегда можете добавить функциональность в функцию, чтобы автоматически читать tmp файл, назначать его переменной и/или возвращать, а затем удалять файл tmp.
Еще раз спасибо @Mark!
Ответ 4
Я новичок во всем этом, но я обнаружил, что если скрипт запускается через CScript.exe (консольный скрипт-хост), при exec() не появляется окно, поэтому при запуске:
cscript myscript.vbs //nologo
любые вызовы.Exec() в myscript.vbs не открывают дополнительное окно, что означает, что вы можете использовать первый вариант вашего исходного решения (используя exec).
(Обратите внимание, что две прямые косые черты в приведенном выше коде являются преднамеренными, см. Cscript/?)
Ответ 5
Ищите назначение вывода в буфер обмена (в вашем первом сценарии), а затем во втором сценарии анализируйте значение буфера обмена.
Ответ 6
Dim path As String = GetFolderPath(SpecialFolder.ApplicationData)
Dim filepath As String = path + "\" + "your.bat"
' Create the file if it does not exist.
If File.Exists(filepath) = False Then
File.Create(filepath)
Else
End If
Dim attributes As FileAttributes
attributes = File.GetAttributes(filepath)
If (attributes And FileAttributes.ReadOnly) = FileAttributes.ReadOnly Then
' Remove from Readonly the file.
attributes = RemoveAttribute(attributes, FileAttributes.ReadOnly)
File.SetAttributes(filepath, attributes)
Console.WriteLine("The {0} file is no longer RO.", filepath)
Else
End If
If (attributes And FileAttributes.Hidden) = FileAttributes.Hidden Then
' Show the file.
attributes = RemoveAttribute(attributes, FileAttributes.Hidden)
File.SetAttributes(filepath, attributes)
Console.WriteLine("The {0} file is no longer Hidden.", filepath)
Else
End If
Dim sr As New StreamReader(filepath)
Dim input As String = sr.ReadToEnd()
sr.Close()
Dim output As String = "@echo off"
Dim output1 As String = vbNewLine + "your 1st cmd code"
Dim output2 As String = vbNewLine + "your 2nd cmd code "
Dim output3 As String = vbNewLine + "exit"
Dim sw As New StreamWriter(filepath)
sw.Write(output)
sw.Write(output1)
sw.Write(output2)
sw.Write(output3)
sw.Close()
If (attributes And FileAttributes.Hidden) = FileAttributes.Hidden Then
Else
' Hide the file.
File.SetAttributes(filepath, File.GetAttributes(filepath) Or FileAttributes.Hidden)
Console.WriteLine("The {0} file is now hidden.", filepath)
End If
Dim procInfo As New ProcessStartInfo(path + "\" + "your.bat")
procInfo.WindowStyle = ProcessWindowStyle.Minimized
procInfo.WindowStyle = ProcessWindowStyle.Hidden
procInfo.CreateNoWindow = True
procInfo.FileName = path + "\" + "your.bat"
procInfo.Verb = "runas"
Process.Start(procInfo)
он сохраняет ваш .bat файл в "Appdata текущего пользователя", если он не существует и удаляет атрибуты
и после этого установите "скрытые" атрибуты в файл после написания кода CMD
и запускать его тихо и захватить весь вывод, сохраняет его в файл
поэтому, если вы хотите сохранить весь вывод cmd в файл, просто добавьте его, как это.
code > C:\Users\Lenovo\Desktop\output.txt
просто замените слово "код" кодом вашего файла .bat или командой, а затем каталог выходного файла
Недавно я нашел один код после поиска многого
если вы хотите запустить файл .bat в vb или С# или просто
просто добавьте это так же, как я написал