Eseguendo la riga di comando silenziosamente con VbScript e ottenendo l’output?

Voglio essere in grado di eseguire un programma attraverso la riga di comando e voglio avviarlo con VbScript. Voglio anche ottenere l’output della riga di comando e assegnarlo a una variabile e voglio che tutto ciò avvenga in silenzio senza che si verifichi la comparsa di cmd windows. Ho gestito due cose separatamente ma non insieme. Ecco cosa ho ottenuto finora. Esegui il comando da cmd e ottieni l’output:

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 

Lo script sopra funziona e fa quello che voglio tranne che cmd si apre per un breve momento.

Ecco uno script che verrà eseguito silenziosamente ma non catturerà l’output

 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) 

C’è un modo per far lavorare insieme questi due?

Lascia che ti illustri sul perché voglio farlo. In pratica sto sondaggiando un’unità ogni 5-10 minuti e ho intenzione di ottenere che lo script invii un’email o getti una finestra di messaggio quando si verifica una determinata condizione, ma non voglio vedere la riga di cmd spuntare tutto il giorno sul mio computer. Eventuali suggerimenti? Grazie

È ansible redirect l’output a un file e quindi leggere il file:

 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 

Ho preso questo e altri commenti e creato una funzione un po ‘più avanzata per eseguire un’applicazione e ottenere l’output.

Esempio per chiamare la funzione: emetterà l’elenco DIR di C: \ solo per le directory. L’output verrà restituito alla variabile CommandResults e rimarrà in C: \ OUTPUT.TXT.

 CommandResults = vFn_Sys_Run_CommandOutput("CMD.EXE /C DIR C:\ /AD",1,1,"C:\OUTPUT.TXT",0,1) 

Funzione

 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 

Altrimenti, cerca di assegnare l’output agli Appunti (nel tuo primo script) e poi al secondo valore di analisi degli appunti.

Se hai qualche altro metodo, ti prego di suggerirmelo.

@ Mark Cidade

Grazie Marco! Questo ha risolto alcuni giorni di ricerca sul chiedersi come dovrei chiamarlo dal PHP WshShell. Quindi grazie al tuo codice, ho pensato …

 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; } 

Questo è ciò che ha funzionato per me nel mio caso. Sentiti libero di usare e modificare secondo le tue esigenze. È sempre ansible aggiungere funzionalità all’interno della funzione per leggere automaticamente il file tmp, assegnarlo a una variabile e / o restituirlo e quindi eliminare il file tmp. Grazie ancora @ Mark!

 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) 

salva il tuo file .bat in “Appdata dell’utente corrente”, se non esiste e rimuove gli attributi e successivamente imposta gli attributi “nascosti” sul file dopo aver scritto il tuo codice cmd ed eseguirlo in modo silenzioso e catturare tutto l’output lo salva in file quindi se vuoi salvare tutti gli output di cmd in file basta aggiungere il tuo come questo

 code > C:\Users\Lenovo\Desktop\output.txt 

basta sostituire la parola “codice” con il tuo codice o comando .bat e dopo di ciò la directory del file di output ho trovato un codice recentemente dopo aver cercato molto se vuoi eseguire il file .bat in vb o c # o semplicemente aggiungilo nello stesso modo in cui ho scritto