it-swarm.com.de

Befehlszeile unbeaufsichtigt mit VbScript ausführen und Ausgabe erhalten?

Ich möchte in der Lage sein, ein Programm über die Befehlszeile auszuführen, und ich möchte es mit VbScript starten. Ich möchte auch die Ausgabe der Befehlszeile abrufen und sie einer Variablen zuweisen, und ich möchte, dass all dies ohne Cmd-Fenster im Hintergrund ausgeführt wird. Ich habe zwei Dinge getrennt geschafft, aber nicht zusammen. Hier ist was ich bis jetzt bekommen habe . Führen Sie den Befehl von cmd aus und erhalten Sie die Ausgabe:

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

Das obige Skript funktioniert und macht was ich will, außer dass cmd für einen kurzen Moment auftaucht. 

Hier ist ein Skript, das automatisch ausgeführt wird, die Ausgabe jedoch nicht erfasst

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)

Gibt es eine Möglichkeit, diese beiden zusammenzubringen?

Ich möchte Ihnen einen Hintergrund geben, warum ich dies tun möchte. Ich frage im Prinzip alle 5-10 Minuten eine Einheit ab und ich werde das Skript dazu bringen, eine E-Mail zu senden oder ein Meldungsfeld zu werfen, wenn eine bestimmte Bedingung auftritt, aber ich möchte nicht, dass die cmd-Zeile den ganzen Tag auf meinem Computer erscheint. Anregungen? Danke

30
Onat

Sie können die Ausgabe in eine Datei umleiten und dann die Datei lesen:

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
34
Mark Cidade

Ich habe diese und verschiedene andere Kommentare übernommen und eine etwas erweiterte Funktion zum Ausführen einer Anwendung und zum Abrufen der Ausgabe erstellt.

Beispiel für Aufruffunktion: Gibt nur die DIR-Liste von C:\für Verzeichnisse aus. Die Ausgabe wird an die Variable CommandResults zurückgegeben und verbleibt in C:\OUTPUT.TXT.

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

Funktion

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
10
Tony Wolf

@ Mark Cidade

Danke Markus! Dies löste ein paar Tage der Forschung über die Frage, wie ich dies von der PHP WshShell nennen sollte. Dank Ihres Codes habe ich mir gedacht ...

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

Das hat bei mir in meinem Fall funktioniert. Fühlen Sie sich frei, zu verwenden und entsprechend Ihren Bedürfnissen zu ändern. Sie können jederzeit Funktionen hinzufügen, um die tmp-Datei automatisch zu lesen, einer Variablen zuzuweisen und/oder zurückzugeben und anschließend die tmp-Datei zu löschen

0
GTodorov

Ich bin ziemlich neu bei all dem, aber ich habe festgestellt, dass, wenn das Skript über CScript.exe (Konsolen-Scripting-Host) gestartet wird, kein Fenster auf exec () erscheint: also beim Ausführen: 

cscript myscript.vbs //nologo

bei Aufrufe von .Exec () in myscript.vbs wird kein zusätzliches Fenster geöffnet. Dies bedeutet, dass Sie die erste Variante Ihrer ursprünglichen Lösung (mithilfe von exec) verwenden können.

(Beachten Sie, dass die beiden Schrägstriche im obigen Code beabsichtigt sind, siehe cscript /?)

0
Johannes Thoma