2013-04-09 3 views
7

J'ai ce script qui lit une liste d'ordinateurs et vérifie si les ordinateurs ont la bonne version de logiciel installée. l'écho de script pour moi les ordinateurs avec la mauvaise version, mais je veux faire un journal à la placecomment ajouter un journal à mon 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 

quelqu'un peut me aider s'il vous plaît merci

Répondre

14

Il y a plusieurs façons de le faire. La façon la plus simple, sans aucune modification à votre script, serait d'appeler le script avec cscript.exe (dans une invite de commande) et rediriger la sortie vers un fichier:

cscript your.vbs > output.log 

Cependant, si vous voulez un journal à créer Même lorsque les utilisateurs cliquent deux fois sur votre script, vous devez modifier votre script pour qu'il écrit dans un fichier au lieu de renvoyer la sortie. Ouvrez le fichier journal au début du script:

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

remplacer WScript.Echo ... avec myLog.WriteLine ..., et fermez le fichier avant de quitter le script:

myLog.Close 

Une approche un peu plus sophistiqué serait de créer un ensemble de fonctions de journalisation, qui vous permettra de créer des lignes de journal en fonction de certaines conditions, par exemple LogInfo() pour les messages de journal d'information et LogError() pour les erreurs.

Shameless plug: Il y a quelque temps je me suis marre d'écrire les mêmes fonctions d'enregistrement de passe-partout, encore et encore, j'ai donc écrit un logger class qui encapsule les installations d'exploitation habituels (console interactive, fichiers, EventLog) et fournit l'exploitation forestière méthodes pour 4 niveaux de log (Erreur, Avertissement, Information, Débogage). La classe peut être utilisée pour se connecter à un fichier comme celui-ci:

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

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

Le fichier journal est automatiquement fermé lorsque l'objet est libéré. Pourquoi ne pas utiliser le journal des événements du système?

+0

merci Ansgar, comment puis-je mettre en œuvre votre classe logger avec mon script – user1766952

+0

Copiez/collez le code de la classe dans votre script et utilisez-le comme décrit ci-dessus. –

2

Je décrit comment dans this answer

Cela signifie la plupart du travail est fait pour vous et vous n'avez pas besoin de vous soucier de l'endroit où placer votre fichier journal

Questions connexes