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-Key: 233279

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

Printed on: April 23, 2024 at 22:04 o'clock

Member: colinardo
colinardo Mar 21, 2014 updated at 12:31:49 (UTC)
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
Member: SaschaRD
SaschaRD Mar 21, 2014 at 13:22:10 (UTC)
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
Member: colinardo
colinardo Mar 21, 2014 updated at 14:10:40 (UTC)
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") 
Member: colinardo
Solution colinardo Mar 21, 2014 updated at 14:33:25 (UTC)
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)  
Member: SaschaRD
SaschaRD Mar 21, 2014 at 14:20:37 (UTC)
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
Member: colinardo
Solution colinardo Mar 21, 2014, updated at Mar 25, 2014 at 10:15:51 (UTC)
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