2013-04-09 12 views
7

Mam ten skrypt, który odczytuje listę komputerów i sprawdza, czy na komputerach zainstalowana jest odpowiednia wersja oprogramowania. Echo skrypt mi ​​komputery z niewłaściwej wersji, ale chcę, aby dziennik zamiastjak dodać dziennik do mojego vbscript

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 

może ktoś mi pomóc proszę dzięki

Odpowiedz

14

Istnieje kilka sposobów, aby to zrobić. Najprostszy sposób, bez żadnych modyfikacji do skryptu, byłoby wywołać skrypt cscript.exe (w wierszu polecenia) i przekierować dane wyjściowe do pliku:

cscript your.vbs > output.log 

Jednak jeśli chcesz dziennika mają być utworzone nawet gdy użytkownicy dwukrotnie klikną twój skrypt, będziesz musiał zmienić swój skrypt tak, aby zapisywał się do pliku zamiast wyświetlać dane wyjściowe. Otwórz plik dziennika na początku skryptu:

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

zastąpić WScript.Echo ... z myLog.WriteLine ... i zamknij plik przed zamknięciem skryptu:

myLog.Close 

Nieco bardziej wyrafinowane podejście byłoby stworzenie zestaw funkcji logowania, który pozwoli Ci tworzyć linie logów w zależności od pewnych warunków, np LogInfo() dla komunikatów dziennika informacyjnego i LogError() dla błędów.

bezwstydna: Jakiś czas temu dostałem dosyć znowu pisać te same funkcje rejestrowania boilerplate kółko, więc napisałem logger class który obudowuje zwykłe mechanizm logowania (interaktywna konsola, pliki eventlog) i zapewnia rejestrowanie metody dla 4 poziomów logowania (błąd, ostrzeżenie, informacje, debugowanie). Za pomocą tej klasy można zalogować się do pliku podobnego do następującego:

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

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

Plik dziennika jest automatycznie zamykany po zwolnieniu obiektu.

+0

dziękuję Ansgar, w jaki sposób można zaimplementować klasę rejestratora z moim skrypt – user1766952

+0

Skopiuj/wklej kod zajęć do swojego skryptu i używaj go jak opisano powyżej. –

2

Dlaczego nie użyć dziennika zdarzeń systemu? Opisałem jak w this answer

Oznacza to większość pracy odbywa się za was i nie trzeba się martwić, gdzie umieścić plik dziennika

Powiązane problemy