Avatar of David
David
 asked on

VBScript WMI old Values get reused

Dear All,

I am using a script to monitor our 2003 Server Disk Space and just stumbled over a bug.
I am pulling the Disk Space of each logical Drive via WMI which has been working fine, the issue is that if for what ever reason WMI dos not get a value, it reuses the previous received value.

For Example I have:
Server A:
Disk C 500GB and 200 free
Disk E 200GB and 50 free

Server B:
Is powered off

Server C:
Disk C 300GB and 200 free
Disk E 100GB and 50 free


My Result would be:
Server A:
Disk C 500GB and 200 free
Disk E 200GB and 50 free

Server B:
Disk C 500GB and 200 free (Value from Server A)
Disk E 200GB and 50 free (Value from Server A)

Server C:
Disk C 300GB and 200 free
Disk E 100GB and 50 free

How can I prevent theWMI object to use the old Values?
 
My code looks like this:

On Error Resume Next 
Const ForAppending = 2 
Const HARD_DISK = 3 
Const ForReading = 1 
 
'Declaring the variables 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set SrvList = objFSO.OpenTextFile("Server_List.txt", ForReading) 
Set ReportFile = objFSO.OpenTextFile ("D:\WEB\DiskSpace.html", ForAppending, True) 
i = 0 
 
'Initializing the HTML Tags for better formatting 
ReportFile.writeline("<html>") 
ReportFile.writeline("<head>") 
ReportFile.writeline("<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>") 
ReportFile.writeline("<title>" & " Servers Disk Space Report "& Date & " , " & Time &"</title>") 
ReportFile.writeline("<style type='text/css'>") 
ReportFile.writeline("<!--") 
ReportFile.writeline("td {") 
ReportFile.writeline("font-family: Tahoma;") 
ReportFile.writeline("font-size: 11px;") 
ReportFile.writeline("border-top: 1px solid #999999;") 
ReportFile.writeline("border-right: 1px solid #999999;") 
ReportFile.writeline("border-bottom: 1px solid #999999;") 
ReportFile.writeline("border-left: 1px solid #999999;") 
ReportFile.writeline("padding-top: 0px;") 
ReportFile.writeline("padding-right: 0px;") 
ReportFile.writeline("padding-bottom: 0px;") 
ReportFile.writeline("padding-left: 0px;") 
ReportFile.writeline("}") 
ReportFile.writeline("body {") 
ReportFile.writeline("margin-left: 5px;") 
ReportFile.writeline("margin-top: 5px;") 
ReportFile.writeline("margin-right: 0px;") 
ReportFile.writeline("margin-bottom: 10px;") 
ReportFile.writeline("") 
ReportFile.writeline("table {") 
ReportFile.writeline("border: thin solid #000000;") 
ReportFile.writeline("}") 
ReportFile.writeline("-->") 
ReportFile.writeline("</style>") 
ReportFile.writeline("</head>") 
ReportFile.writeline("<body>") 
 
ReportFile.writeline("<table width='50%'>") 
ReportFile.writeline("<tr bgcolor='#CCCCCC'>") 
ReportFile.writeline("<td colspan='7' height='25' align='center'>") 
ReportFile.writeline("<font face='tahoma' color='#003399' size='2'><strong>Disk Space Report  "& Date & " , " & Time &"</strong></font>") 
ReportFile.writeline("</td>") 
ReportFile.writeline("</tr>") 
ReportFile.writeline("</table>") 
 
 
'Declaring the Server Name for report generation 
Do Until SrvList.AtEndOfStream 
    StrComputer = SrvList.Readline 
 
    ReportFile.writeline("<table width='50%'><tbody>") 
    ReportFile.writeline("<tr bgcolor='#CCCCCC'>") 
    ReportFile.writeline("<td width='50%' align='center' colSpan=6><font face='tahoma' color='#003399' size='2'><strong>" & StrComputer & "</strong></font></td>") 
    ReportFile.writeline("</tr>") 
 
 
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
    Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk Where DriveType = " & HARD_DISK & "") 
 
    ReportFile.writeline("<tr bgcolor=#CCCCCC>") 
        ReportFile.writeline("<td width='05%' align='center'>Drive / Mount</td>") 
        ReportFile.writeline("<td width='05%' align='center'>Total Capacity (in GB)</td>") 
        ReportFile.writeline("<td width='05%' align='center'>Used Capacity (in GB)</td>") 
        ReportFile.writeline("<td width='05%' align='center'>Free Space (in GB)</td>") 
        ReportFile.writeline("<td width='05%' align='center'>Freespace %</td>") 
    ReportFile.writeline("</tr>") 
 
        'Starting the loop to gather values from all Hard Drives 
        For Each objDisk in colDisks 
 
            'Delcaring the Variables


            TotSpace=Round(((objDisk.Size)/1073741824),2) 
            FrSpace=Round(objDisk.FreeSpace/1073741824,2) 
            FrPercent=Round((FrSpace / TotSpace)*100,0) 
            UsSpace=Round((TotSpace - FrSpace),2) 
            Drv=objDisk.DeviceID 
            VolName=objDisk.DeviceID 
 
            'Lnt=Len(VolName) 
 
            'If  Len(VolName) =  3 then 
                If FrPercent > 20 Then 
                    ReportFile.WriteLine "<tr><td align=center>" & Drv & "</td><td align=center>" & TotSpace & "</td><td align=center>" & UsSpace & "</td><td align=center>" & FrSpace & "</td><td BGCOLOR='#00FF00' align=center>" & FrPercent & "%" &"</td></tr>" 
                ElseIf FrPercent < 10 Then 
                    ReportFile.WriteLine "<tr><td align=center>" & Drv & "</td><td align=center>" & TotSpace & "</td><td align=center>" & UsSpace & "</td><td align=center>" & FrSpace & "</td><td bgcolor='#FF0000' align=center>" & FrPercent & "%" &"</td></tr>" 
                Else 
                    ReportFile.WriteLine "<tr><td align=center>" & Drv & "</td><td align=center>" & TotSpace & "</td><td align=center>" & UsSpace & "</td><td align=center>" & FrSpace & "</td><td bgcolor='#FBB917' align=center>" & FrPercent & "%" &"</td></tr>" 
                End If 
            'Else 
            'End If 
        Next 
 
    ReportFile.writeline("<tr>") 
    ReportFile.writeline("<td width='50%' colSpan=6>&nbsp;</td>") 
    ReportFile.writeline("</tr>") 
 
    ReportFile.writeline("</tbody></table>") 
Loop 
ReportFile.WriteLine "</body></html>"

Open in new window

VB ScriptScripting LanguagesWindows Server 2003

Avatar of undefined
Last Comment
Joe Howard

8/22/2022 - Mon
ASKER CERTIFIED SOLUTION
Joe Howard

Log in or sign up to see answer
Become an EE member today7-DAY FREE TRIAL
Members can start a 7-Day Free trial then enjoy unlimited access to the platform
Sign up - Free for 7 days
or
Learn why we charge membership fees
We get it - no one likes a content blocker. Take one extra minute and find out why we block content.
Not exactly the question you had in mind?
Sign up for an EE membership and get your own personalized solution. With an EE membership, you can ask unlimited troubleshooting, research, or opinion questions.
ask a question
David

ASKER
Thanks MacroShadow! and that solves the issue but brings me to another, I have the same problem with logical drives,
Say server X has

Drive C with 90GB
Drive E with 180Gb
Drive F with 70GB

Every now end then I get results like:

Drive C with 90GB
Drive E with 90GB
Drive F with 70GB

I am almost sure that this is do to the WMI querry on Drive E Failing for what ever reason and the Script just reuses the value it received before on the C Drive.

I tried emptying my Variables  like:
      TotSpace=""
      FrSpace=""
      FrPercent=""
      UsSpace=""
      Drv=""
      VolName=""

Before assigning values but it had no impact.
David

ASKER
I think I got it, probably not the most elegant way but I think this will do.
 See additions in Line 66, 67, 82, 87

On Error Resume Next 
Const ForAppending = 2 
Const HARD_DISK = 3 
Const ForReading = 1 
 
'Declaring the variables 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set SrvList = objFSO.OpenTextFile("Server_List.txt", ForReading) 
Set ReportFile = objFSO.OpenTextFile ("D:\WEBsites\ServerMonitoringSite\DiskSpace.html", ForAppending, True) 
i = 0 
 
'Initializing the HTML Tags for better formatting 
ReportFile.writeline("<html>") 
ReportFile.writeline("<head>") 
ReportFile.writeline("<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>") 
ReportFile.writeline("<title>" & "Disk Space Report "& Date & " , " & Time &"</title>") 
ReportFile.writeline("<style type='text/css'>") 
ReportFile.writeline("<!--") 
ReportFile.writeline("td {") 
ReportFile.writeline("font-family: Tahoma;") 
ReportFile.writeline("font-size: 11px;") 
ReportFile.writeline("border-top: 1px solid #999999;") 
ReportFile.writeline("border-right: 1px solid #999999;") 
ReportFile.writeline("border-bottom: 1px solid #999999;") 
ReportFile.writeline("border-left: 1px solid #999999;") 
ReportFile.writeline("padding-top: 0px;") 
ReportFile.writeline("padding-right: 0px;") 
ReportFile.writeline("padding-bottom: 0px;") 
ReportFile.writeline("padding-left: 0px;") 
ReportFile.writeline("}") 
ReportFile.writeline("body {") 
ReportFile.writeline("margin-left: 5px;") 
ReportFile.writeline("margin-top: 5px;") 
ReportFile.writeline("margin-right: 0px;") 
ReportFile.writeline("margin-bottom: 10px;") 
ReportFile.writeline("") 
ReportFile.writeline("table {") 
ReportFile.writeline("border: thin solid #000000;") 
ReportFile.writeline("}") 
ReportFile.writeline("-->") 
ReportFile.writeline("</style>") 
ReportFile.writeline("</head>") 
ReportFile.writeline("<body>") 
 
ReportFile.writeline("<table width='50%'>") 
ReportFile.writeline("<tr bgcolor='#CCCCCC'>") 
ReportFile.writeline("<td colspan='7' height='25' align='center'>") 
ReportFile.writeline("<font face='tahoma' color='#003399' size='2'><strong>Disk Space Report  "& Date & " , " & Time &"</strong></font>") 
ReportFile.writeline("</td>") 
ReportFile.writeline("</tr>") 
ReportFile.writeline("</table>") 
 
 
'Declaring the Server Name for report generation 
Do Until SrvList.AtEndOfStream 
    StrComputer = SrvList.Readline 
 
    ReportFile.writeline("<table width='50%'><tbody>") 
    ReportFile.writeline("<tr bgcolor='#CCCCCC'>") 
    ReportFile.writeline("<td width='50%' align='center' colSpan=6><font face='tahoma' color='#003399' size='2'><strong>" & StrComputer & "</strong></font></td>") 
    ReportFile.writeline("</tr>") 
 
    Set objWMIService = Nothing
    Set ColDisks = Nothing 

    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
    Set colDisks = objWMIService.ExecQuery("Select * from Win32_LogicalDisk Where DriveType = " & HARD_DISK & "")
    Set previousValue = objDisk
 
    ReportFile.writeline("<tr bgcolor=#CCCCCC>") 
        ReportFile.writeline("<td width='05%' align='center'>Drive / Mount</td>") 
        ReportFile.writeline("<td width='05%' align='center'>Total Capacity (in GB)</td>") 
        ReportFile.writeline("<td width='05%' align='center'>Used Capacity (in GB)</td>") 
        ReportFile.writeline("<td width='05%' align='center'>Free Space (in GB)</td>") 
        ReportFile.writeline("<td width='05%' align='center'>Freespace %</td>") 
    ReportFile.writeline("</tr>") 
 
	Set previousValue = objDisk

        'Starting the loop to gather values from all Hard Drives 
       
	For Each objDisk in colDisks 
		If Not previousValue = objDisk then
             
 		
	            'Delcaring the Variables


	            TotSpace=Round(((objDisk.Size)/1073741824),2) 
        	    FrSpace=Round(objDisk.FreeSpace/1073741824,2) 
           	 FrPercent=Round((FrSpace / TotSpace)*100,0) 
            	UsSpace=Round((TotSpace - FrSpace),2) 
           	 Drv=objDisk.DeviceID 
            	VolName=objDisk.DeviceID 
 
 	           'Lnt=Len(VolName) 
 
 	           'If  Len(VolName) =  3 then 
        	        If FrPercent > 20 Then 
                	    ReportFile.WriteLine "<tr><td align=center>" & Drv & "</td><td align=center>" & TotSpace & "</td><td align=center>" & UsSpace & "</td><td align=center>" & FrSpace & "</td><td BGCOLOR='#00FF00' align=center>" & FrPercent & "%" &"</td></tr>" 
            	    ElseIf FrPercent < 10 Then 
                	    ReportFile.WriteLine "<tr><td align=center>" & Drv & "</td><td align=center>" & TotSpace & "</td><td align=center>" & UsSpace & "</td><td align=center>" & FrSpace & "</td><td bgcolor='#FF0000' align=center>" & FrPercent & "%" &"</td></tr>" 
             	   Else 
                	    ReportFile.WriteLine "<tr><td align=center>" & Drv & "</td><td align=center>" & TotSpace & "</td><td align=center>" & UsSpace & "</td><td align=center>" & FrSpace & "</td><td bgcolor='#FBB917' align=center>" & FrPercent & "%" &"</td></tr>" 
   	             End If 
        	    'Else 
            	'End If
	End If 
        Next 
   
    Set objWMIService = Nothing
    Set ColDisks = Nothing 
    ReportFile.writeline("<tr>") 
    ReportFile.writeline("<td width='50%' colSpan=6>&nbsp;</td>") 
    ReportFile.writeline("</tr>") 
 
    ReportFile.writeline("</tbody></table>") 
Loop 
ReportFile.WriteLine "</body></html>"

Open in new window

Joe Howard

Nice workaround, although I'm not sure why you encountered the problem in the first place.
Experts Exchange is like having an extremely knowledgeable team sitting and waiting for your call. Couldn't do my job half as well as I do without it!
James Murphy