2013-04-09 8 views
7

Ich habe dieses Skript, das eine Liste von Computern liest und überprüfen, ob die Computer die richtige Softwareversion installiert haben. das Skript echo der Computer mit der falschen Version für mich, aber ich will jemand ein Protokoll stattwie ich meinem vbscript ein Protokoll hinzufügen

Dim strComputer, objFSO, ObjShell, strDisplayName, objList, strObject 
Dim objReg, arrSubKeys, strProduct, strVersion, strReqVersion 
Const For_Writing = 2 
Const ForReading = 1 
const ForAppending = 3 
Const HKLM  = &H80000002 
Const strKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" 
strReqVersion = "8.2.1 MP2" 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objShell = CreateObject("WScript.Shell") 
Set objList = objFSO.OpenTextFile("c:\test\test.txt",ForReading) 
Do While Not objList.AtEndOfStream 
    strComputer = objList.ReadLine 
    If HostOnline(strComputer) = True Then 
     Inventory(strComputer) 
    End If 
Loop 
Function Inventory(strComputer) 
Set objTextFile = objFSO.OpenTextFile("c:\test\inventory.txt",2,true) 
'creating a dictionary object 
Set objDictionary = CreateObject("Scripting.Dictionary") 
Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & _ 
    strComputer & "\root\default:StdRegProv") 
    ' Enumerate the subkeys of the Uninstall key 
    objReg.EnumKey HKLM, strKeyPath, arrSubKeys 
    For Each strProduct In arrSubKeys 
    ' Get the product's display name 
     objReg.GetStringValue HKLM, strKeyPath & "\" & strProduct, "DisplayName", strDisplayName 
    ' Process only products whose name contain 'symantec' 
     If InStr(1, strDisplayName, "Symantec", vbTextCompare) > 0 Then 
    ' Get the product's display version 
     objReg.GetStringValue HKLM, strKeyPath & "\" & strProduct, "DisplayVersion", strVersion 
     If strReqVersion <> strVersion Then 
      WScript.Echo strObject 
      objDictionary.Add strComputer, strVersion 
      For Each strObject In objDictionary 
      WScript.Echo strObject 

      objTextFile.WriteLine(strObject) 
      Next 
      objTextFile.Close    
     End If  
     End If 
    Next 
End Function 
Function HostOnline(strComputername) 
'---------- Test to see if host or url alive through ping ----------------- 
' Returns True if Host responds to ping 
' 
' strComputername is a hostname or IP 
    Const OpenAsASCII = 0 
    Const FailIfNotExist = 0 
    Const ForReading = 1 
    Dim objShell, objFSO, sTempFile, fFile 
    Set objShell = CreateObject("WScript.Shell") 
    Set objFSO = CreateObject("Scripting.FileSystemObject") 
    sTempFile = objFSO.GetSpecialFolder(2).ShortPath & "\" & objFSO.GetTempName 
    objShell.Run "cmd /c ping -n 2 -l 8 " & strComputername & ">" & sTempFile, 0 , True 
    Set fFile = objFSO.OpenTextFile(sTempFile, ForReading, FailIfNotExist, OpenAsASCII) 
    Select Case InStr(fFile.ReadAll, "TTL=") 
     Case 0 
      HostOnline = False 
     Case Else 
      HostOnline = True 
    End Select 
    ffile.close 
    objFSO.DeleteFile(sTempFile) 
    Set objFSO = Nothing 
    Set objShell = Nothing 
End Function 

kann mir dabei helfen, bitte Dank

Antwort

14

Es gibt mehr Möglichkeiten, dies zu tun. Die einfachste Art und Weise, ohne Änderungen an Ihren Skript, wäre das Skript zu nennen mit cscript.exe (in einer Eingabeaufforderung) und die Ausgabe in eine Datei umleiten:

cscript your.vbs > output.log 

Wenn Sie jedoch ein Protokoll erstellt werden soll Selbst wenn Benutzer auf Ihr Skript doppelklicken, müssen Sie Ihr Skript so ändern, dass es in eine Datei schreibt, anstatt die Ausgabe zu wiederholen. Öffnen Sie die Protokolldatei am Anfang des Skripts:

Set myLog = objFSO.OpenTextFile("C:\my.log", For_Writing, True) 

ersetzen WScript.Echo ... mit myLog.WriteLine ..., und schließen Sie die Datei, bevor Sie Ausfahrt aus dem Skript:

myLog.Close 

Eine etwas anspruchsvollere Ansatz wäre zu schaffen eine Reihe von Logging-Funktionen, mit denen Sie Log-Zeilen abhängig von bestimmten Bedingungen erstellen können, z LogInfo() für informative Protokollmeldungen und LogError() für Fehler.

Shameless Stecker: Vor einiger Zeit habe ich mit dem Schreiben der gleichen Text Logging-Funktionen immer und immer wieder satt, so schrieb ich ein logger class, die die üblichen Protokollierungsmöglichkeiten (interaktive Konsole, Dateien, eventlog) und bieten die Protokollierung kapselt Methoden für 4 Log-Level (Fehler, Warnung, Information, Debug). Die Klasse kann für die Protokollierung in einer Datei wie der folgenden verwendet werden:

Set myLog = New CLogger 
myLog.LogToConsole = False 
myLog.LogFile = "C:\my.log" 

myLog.LogInfo "info message" 
... 
myLog.LogError "an error occurred" 

Die Protokolldatei wird automatisch geschlossen, wenn das Objekt freigegeben wird.

+0

danke Ansgar zu setzen, wie ich Ihre Logger-Klasse implementieren kann mit meinem Skript – user1766952

+0

Kopieren Sie den Klassencode in Ihr Skript und verwenden Sie es wie oben beschrieben. –

2

Warum nicht das Ereignisprotokoll des Systems verwenden? Ich beschrieb, wie in this answer

Es bedeutet, die meiste Arbeit für Sie erledigt ist, und Sie müssen sich nicht darum kümmern, wo Ihre Log-Datei

Verwandte Themen