7 Stimmen

vbs wie erhalte ich ein Ergebnis von einem Kommandozeilenbefehl

Ich möchte das Ergebnis eines einfachen Befehls aus der Befehlszeile (cmd.exe) mithilfe eines Windows-Skripts (.vbs) abrufen. Wie wird das gemacht? Ich habe kein gutes/einfaches Beispiel oder eine Erklärung gefunden. Sie könnten den Befehl "date" oder "time" verwenden, um ein Beispiel zu geben. Zum Beispiel:

enter image description here

P.S. Ich bin in der Lage, den Skriptcode zu schreiben, der cmd.exe öffnet und den Befehl sendet.

Gracias.

10voto

Ansgar Wiechers Punkte 187721

Im Zweifelsfall lesen Sie bitte die Dokumentation . Wahrscheinlich wollen Sie so etwas wie das hier:

Set p = CreateObject("WScript.Shell").Exec("%COMSPEC% /c date /t")
Do While p.Status = 0
  WScript.Sleep 100
Loop
WScript.Echo p.StdOut.ReadAll

Edita: Bei der Verwendung von Exec() übergeben Sie Eingaben über die .StdIn Deskriptor, nicht über SendKeys() (was ohnehin eine eher unzuverlässige Art der Übermittlung von Eingaben ist).

%COMSPEC% ist eine Systemumgebungsvariable mit dem vollständigen Pfad zu cmd.exe und die /c Option macht cmd.exe nach dem Befehl beenden ( date /t im Beispiel) ist beendet.

Wenn der Befehl Erfolg/Fehlschlag mit einem Exit-Code anzeigt, können Sie die ExitCode nachdem der Befehl beendet wurde.

If p.Status <> 0 Then WScript.Echo p.ExitCode

Bearbeiten2: Anstelle der Verwendung von atprogram interaktiv, können Sie Befehlszeilen konstruieren, die bestimmte Aufgaben ohne Benutzerinteraktion ausführen? Bei nicht interaktiven Befehlszeilen könnte so etwas funktionieren:

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 ruft eine Eingabeaufforderung auf, ohne einen Befehl auszuführen. Die Seite /k verhindert, dass sie sich schließt. Da es sich nicht automatisch schließt, können Sie die Funktion While p.Status = 0 Schleife hier. Wenn ein Befehl einige Zeit braucht, um fertig zu werden, müssen Sie WScript.Sleep eine Anzahl von Sekunden.

Über cmd.StdIn.WriteLine können Sie Befehlszeilen in der CMD Instanz. Die Funktion ReadOutput() liest die Ausgabe von StdOut bis die nächste Aufforderung erscheint. Sie müssen nach der Aufforderung Ausschau halten, da Lesevorgänge blockiert werden, so dass Sie nicht einfach sagen können: "Lesen Sie alles, was bisher gedruckt wurde".

Wenn Sie fertig sind, hören Sie auf. CMD.EXE über cmd.Terminate .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X