Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to add a log to my vbscript

Tags:

vbscript

i have this script that reads a list of computers and check to see if the computers have the right software version install. the script echo to me the computers with the wrong version, but i want to make a log instead

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

can some one help me please thanks

like image 665
user1766952 Avatar asked Apr 09 '13 17:04

user1766952


2 Answers

There are several ways to do this. The simplest way, without any modification to your script, would be to call the script with cscript.exe (in a command prompt) and redirect the output to a file:

cscript your.vbs > output.log

However, if you want a log to be created even when users double-click your script you'll have to change your script so that it writes to a file instead of echoing the output. Open the log file at the beginning of the script:

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

replace WScript.Echo ... with myLog.WriteLine ..., and close the file before you exit from the script:

myLog.Close

A somewhat more sophisticated approach would be to create a set of logging functions, which will allow you create log lines depending on certain conditions, e.g. LogInfo() for informational log messages and LogError() for errors.

Shameless plug: Some time ago I got fed up with writing the same boilerplate logging functions over and over again, so I wrote a logger class that encapsulates the usual logging facilities (interactive console, files, eventlog) and provides logging methods for 4 log levels (Error, Warning, Information, Debug). The class can be used for logging to a file like this:

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

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

The log file is automatically closed when the object is released.

like image 113
Ansgar Wiechers Avatar answered Oct 26 '22 11:10

Ansgar Wiechers


Why not use the system's event log? I described how in this answer

It means most of the work is done for you and you don't need to worry about where to put your log file

like image 22
Jobbo Avatar answered Oct 26 '22 09:10

Jobbo