saschard
Goto Top

VBS: CLI Output umleiten bzw. auslesen

Hallo zusammen,

ich habe mal wieder eine Frage.

Der Inhalt aus dem Command Line Interface möchte ich gern in eine Datei umleiten oder gar direkt verarbeiten können.
	SET Oracle = CreateObject("WScript.shell")  
	Oracle.run "cmd",0  
	Oracle.sendkeys "cd D:\Oracle\product\11.2.0\dbhome_1\OPatch {ENTER}"  
	Oracle.sendkeys "D: {ENTER}"  
	Oracle.sendkeys "opatch lsinventory {ENTER}"  
	Oracle.sendkeys "exit {ENTER}"  
Der Aufruf vom CLI und die Eingaben etc. funkionieren 1A.
Jedoch funktioniert die Umleitung nicht.
	SET Oracle = CreateObject("WScript.shell")  
	Oracle.run "cmd",0  
	Oracle.sendkeys "cd D:\Oracle\product\11.2.0\dbhome_1\OPatch {ENTER}"  
	Oracle.sendkeys "D: {ENTER}"  
	Oracle.sendkeys "opatch lsinventory {ENTER} > output.txt"  
Hier hämmert er mich einfach nur die "> output.txt" ins CLI-Fensterchen.
Eine Umleitung mit sendkeys scheint wohl nicht zu funktionieren (oder es muss ein speziellen Operator eingeben?).

Gruß, Sascha

Content-ID: 233279

Url: https://administrator.de/contentid/233279

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

colinardo
colinardo 21.03.2014 aktualisiert um 13:31:49 Uhr
Goto Top
Hallo Sascha,
dafür gibt es eine elegantere Lösung um an StdOut eines Befehls zu kommen:
back-to-topBeispiel zum Auslesen von StdOut und StdErr einer Befehlszeile
Set objShell = CreateObject("Wscript.Shell")  
Set fso = CreateObject("Scripting.Filesystemobject")  

'Befehl ausführen  
Set oExec = objShell.Exec("cmd /c ping -n 1 localhost")  

'Warte darauf das der Befehl beendet wurde  
Do While oExec.Status = 0
     WScript.Sleep 100
Loop

' StdOut auslesen  
out = ""  
Do While Not oExec.StdOut.AtEndOfStream
   out = out & oExec.StdOut.ReadAll
Loop

'StdErr auslesen  
Do While Not oExec.StdErr.AtEndOfStream
   out = out & oExec.StdErr.ReadAll
Loop

' Zum Test: Ausgabe anzeigen lassen:  
WScript.Echo out

' Ausgabe in Datei schreiben  
fso.OpenTextFile("output.txt",2,True).Write(out)  
Grüße Uwe
SaschaRD
SaschaRD 21.03.2014 um 14:22:10 Uhr
Goto Top
Hallo Uwe,

danke für deine Antwort.

Habe soeben deinen Code verwendet und für meine Zwecke umgebaut. Leider nimmt er den Output den LSInventory in die CLI postet nicht.
Wird LSInventory aufgerufen kommt folgenden Output
D:\Oracle\product\11.2.0\dbhome_1\OPatch>opatch lsinventory
Invoking OPatch 11.1.0.6.6

Oracle Interim Patch-Installationsprogramm Version 11.1.0.6.6
Copyright (c) 2009, Oracle Corporation. All rights reserved. Alle Rechte vorbehalten.


Oracle-Standardverzeichnis       : D:\Oracle\product\11.2.0\dbhome_1
Zentrales Bestandsverzeichnis: C:\Program Files\Oracle\Inventory
   von           : n/a
OPatch-Version    : 11.1.0.6.6
OUI-Version       : 11.2.0.1.0
OUI-Speicherort      : D:\Oracle\product\11.2.0\dbhome_1\oui
Speicherort von Log-Datei: D:\Oracle\product\11.2.0\dbhome_1\cfgtoollogs\opatch\opatch2014-03-21_14-
14-34PM.log

Patch history file: D:\Oracle\product\11.2.0\dbhome_1\cfgtoollogs\opatch\opatch_history.txt

Lsinventory Output file location : D:\Oracle\product\11.2.0\dbhome_1\cfgtoollogs\opatch\lsinv\lsinve
ntory2014-03-21_14-14-34PM.txt

--------------------------------------------------------------------------------
Installierte Produkte der obersten Ebene (1):

Oracle Database 11g                                                  11.2.0.1.0
In diesem Oracle-Standardverzeichnis sind 1 Produkte installiert.


In diesem Oracle-Standardverzeichnis sind keine Interim-Patches installiert.


--------------------------------------------------------------------------------

OPatch succeeded.
Dieser Output ist für mich wichtig.

In der Datei steht zurzeit nur
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten.

c:\Skripte>

Mit "ReadAll" wird der gesamte Inhalt gelesen und mit "ReadLine" sind einzele Zeilen auslesbar? ggf. werde ich es später auf einzelne Zeilen beschränken (OPatch-Version) ist z.B. wichtig.

Gruß, Sascha
colinardo
colinardo 21.03.2014 aktualisiert um 15:10:40 Uhr
Goto Top
Obiges Script gibt nur das zurück was von diesem Befehl zurückgeben wird
Set oExec = objShell.Exec("cmd /c ping -n 1 localhost") 
colinardo
Lösung colinardo 21.03.2014 aktualisiert um 15:33:25 Uhr
Goto Top
Ach .. das müsste reichen... da hast du es umständlicher gemacht als es eigentlich ist face-wink ...
Set objShell = CreateObject("Wscript.Shell")  
Set fso = CreateObject("Scripting.Filesystemobject")  
Set oExec = objShell.Exec("cmd /c ""D:\Oracle\product\11.2.0\dbhome_1\OPatch\opatch.exe"" lsinventory")   
Do While oExec.Status = 0
     WScript.Sleep 100
Loop
out = ""  
Do While Not oExec.StdOut.AtEndOfStream
   out = out & oExec.StdOut.ReadAll
Loop
Do While Not oExec.StdErr.AtEndOfStream
   out = out & oExec.StdErr.ReadAll
Loop
WScript.Echo out
fso.OpenTextFile("output.txt",2,True).Write(out)  
SaschaRD
SaschaRD 21.03.2014 um 15:20:37 Uhr
Goto Top
Hallo Uwe,

wie immer erste Sahne. Vielen Dank.
SET objShell = CreateObject("WScript.Shell")  
SET objFSO = CreateObject("Scripting.Filesystemobject")  
SET objExec = objShell.Exec("cmd /c ""D:\Oracle\product\11.2.0\dbhome_1\OPatch\opatch.bat"" lsinventory")   
	DO WHILE objExec.Status = 0
		WScript.Sleep 10
	LOOP
		out = ""  
		DO WHILE NOT objExec.StdOut.AtEndOfStream
		out = out & objExec.StdOut.ReadAll
		LOOP
			DO WHILE NOT objExec.StdErr.AtEndOfStream
			out = out & objExec.StdErr.ReadAll
			LOOP
			objFSO.OpenTextFile("output.txt",2,True).Write(out)  
So läuft der Hase!

Hättest Du noch einen Vorschlag zum Auslesen von einzelen Zeilen? z.B. OPatch-Version.
Werde es mit ReadLine testen.

Nochmals Danke und Gruß, Sascha
colinardo
Lösung colinardo 21.03.2014, aktualisiert am 25.03.2014 um 11:15:51 Uhr
Goto Top
Zitat von @SaschaRD:
Hättest Du noch einen Vorschlag zum Auslesen von einzelen Zeilen? z.B. OPatch-Version.
Werde es mit ReadLine testen.

Nochmals Danke und Gruß, Sascha
klar kein Problem, das lässt sich mit RegularExpressions einfach machen, werde dir gleich mal ein Beispiel schicken...

das hier unter den Code von Oben gesetzt extrahiert dir die OPatch-Version
Set myRegExp = CreateObject("vbscript.regexp")  
myRegExp.Pattern = "OPatch-Version\s*:\s*([\d\.]+)"  
Set myMatches = myRegExp.Execute(out)
If myMatches.Count > 0 Then
	opatch_version = myMatches(0).SubMatches(0)
End If
wscript.echo opatch_version