VBScript-pätkiä

Hae XMLHTTP-komponentin avulla veppisivun title.

Function URLTitle(URL)
Dim Response
Dim sStart, sEnd

Set Http = CreateObject("Microsoft.XMLHTTP")
Http.Open "GET",URL,False
Http.Send
Response = Http.responseText
sStart=Instr(UCASE(Response),"<TITLE>")
sEnd=Instr(UCASE(Response),"</TITLE>")
    
If sStart >0 And (sEnd > sStart) Then
	URLTitle=Mid(Response,sStart+7,sEnd-sStart-7)
	Else
	URLTitle="Error: No title found"
	End If
End Function

WScript.Echo URLTitle("http://www.sonera.fi")

Perhanan vbscript ja sen funktion objektipalautuksen scope

Tartti oppia miten funktiot vbscriptissä palauttavat objekteja. Scopesta kun tullaan ulos, ei ulkopuolella voi testata IsObject:illa palauttiko funktio järkevää vai ei. Ensin funktio jota kutsutaan (tässä tapauksessa WMI-objektia pathin perusteella hakeva funktio):

Function GetWMIObject (WMIPath)
'
' Yritetään saada WMI-objekti annetun pathin perusteella
'
Dim tempObj

On Error Resume Next
Set tempObj = GetObject(WMIPath)
On Error Goto 0

If IsObject(tempObj) Then 
   ' objekti syntyi, palautetaan se
   Set GetWmiObject = tempObj
   Exit Function
Else
   ' ei saatu objektia, palautetaan nothing
   Set GetWMIObject = Nothing 
   Exit Function
End If
End Function

Sitten kun sitä kutsutaan esimerkiksi loopissa jossa annetaan useampi path, ja keräillään saadut objektit arrayihin, niin seuraava esimerkki EI toimi:

For F=0 to Ubound(WMIPaths) 'WMIPaths on array jossa on kasa patheja

Set objWMI = GetWMIObject (WMIPaths(F))

If IsObject(objWMI) Then
   Redim Preserve ThisMachineWMIs(ubound(ThisMachineWMIs)+1) ' muutetaan arraytä dynaamisesti ja...
   Set ThisMachineWMIs(ubound(ThisMachineWMIs)) = objWMI ' sijoitetaan objekti arrayhin.
End If
Next

Yllä käy niin hassusti, että objWMI on AINA objekti, oli paluuarvo sitten funktiosta "oikea" objekti tai Nothing. Hassua tästä seuraa sen verran, että vaikka objekti ON sisällöltään Nothing, se pointtaa silti mahdollisesti edellisillä kierroksilla saatuun objektiin. Jos siis kerrankin saadaan objekti, kaikilla seuraavilla kierroksilla objektiarrayhin menee KOPIO edellisestä saadusta objektista.

Oikea tapa testata (joka sitten toimii):

For F=0 to Ubound(WMIPaths) 'WMIPaths on array jossa on kasa patheja

Set objWMI = GetWMIObject (WMIPaths(F))

If IsObject(objWMI) and Not (objWMI Is Nothing) Then ' Kun tulee testattua onko objekti Nothing, asia menee oikein.
   Redim Preserve ThisMachineWMIs(ubound(ThisMachineWMIs)+1)
   Set ThisMachineWMIs(ubound(ThisMachineWMIs)) = objWMI
End If
Next

Käyttiksen perustiedot WMI:n läpi

Tartti saada copypaste-kelpoinen hässäkkä aikaan komentoriviltä erilaisiin dokumentaatiohin. Alla tulos.

Copypaste koodista ja talletus vaikka nimellä "get-os-basic-info.vbs". Ajo sitten kätevästi komennolla CSCRIPT get-os-basic-info.vbs

'
' Get operating system basic info v1.0
'
' (C) PLZI 2012
'
Set oWMI = GetObject("winmgmts:root\cimv2")
Set colOS = oWMI.ExecQuery ("Select * from Win32_OperatingSystem")
For Each OS in colOS

	WScript.Echo "Host Information"
	
	Set cItems = oWMI.ExecQuery("Select * from Win32_Computersystem")
	For Each Item in cItems
	WScript.Echo "DNSName: " & vbtab & Item.DNSHostName 
	WScript.Echo "HostName:" & vbtab & Item.Name
	WScript.Echo "Part of domain:" & vbtab & Item.PartOfDomain
	If Item.PartOfDomain Then
	WScript.Echo "Domain name:" & vbtab & Item.Domain
	Wscript.Echo "Domain role:" & vbtab & ConvertRole(Item.DomainRole)
	Else
	Wscript.Echo "Workgroup:" & Item.WorkGroup
	End If
	Next
	WScript.Echo
	WScript.Echo "Operating system information"


	Wscript.Echo "OS:      " & vbtab & OS.Caption 
	Select Case OS.ServicePackMajorVersion
	Case 0
	strSP = "RTM"
	Case Else
	strSP = "Service Pack " & OS.ServicePackMajorVersion
	End Select

	WScript.Echo "SP Level:" & vbtab & strSP
	WScript.Echo "Version: " & vbtab & OS.Version
	WScript.Echo "OS Arch: " & vbtab & ConvertBitness(GetBitness("OS"))
	WScript.Echo "Install Date: " & vbtab & DateTimeToDate(OS.InstallDate)
	WScript.Echo
	WScript.Echo "Hardware information"
	Set cItems = oWMI.ExecQuery("Select * from Win32_Computersystem")
	For Each Item In cItems
		TotalMem = Item.TotalPhysicalMemory	
		TotalProcs = Item.NumberOfProcessors 
		Systype = Item.SystemType
		Model = Item.Model
		Manuf = Item.Manufacturer
	Next
	Set cItems = oWMI.ExecQuery("Select * from Win32_Processor")
	TotalCores = 0
	For Each Item In cItems
		TotalCores = TotalCores + Item.NumberOfCores
	Next
	WScript.Echo "CPUs / Cores:" & vbtab & TotalProcs & "/" & TotalCores 
Next

WScript.Echo "Manufacturer: " & vbtab & Manuf
WScript.Echo "Model:   " & vbtab & Model
WScript.Echo "System type:" & vbTab & SysType
Wscript.Echo "Memory: " & vbtab & ConvertMem (TotalMem)
WScript.Echo "Processors: " & vbtab & ConvertProcs (TotalProcs, Totalcores)
WScript.Echo "HW Arch: " & vbtab & ConvertBitness(GetBitness("HW"))

Function GetBitness(Target)
   Select Case Ucase(Target)
	Case "OS", "WINDOWS", "OPERATING SYSTEM"
	GetBitness = GetObject("winmgmts:root\cimv2:Win32_Processor='cpu0'").AddressWidth
    Case "HW", "HARDWARE"
	GetBitness = GetObject("winmgmts:root\cimv2:Win32_Processor='cpu0'").DataWidth
    Case Else
	GetBitness = 99999 'unknown Target item (OS, Hardware, Process)
   End Select
End Function

Function DatetimeToDate(strUTC)
   Set datetime = CreateObject("WbemScripting.SWbemDateTime")
   datetime.Value = strUTC
   DatetimeToDate = datetime.GetVarDate(True)
End Function

Function ConvertBitness (bitness)
   Select Case Bitness
	Case 32
	ConvertBitness="x86"
	Case 64
	ConvertBitness="x64"
   End Select
End Function

Function ConvertProcs (CPU,Cores)
   Dim PerCpu 
   Dim CPUText
   CPUText = Array ("None", "Single","Dual","Tri","Quad","Penta","Hexa","Hepta","Octa","Nona","Deca")
   PerCPU = Cores / CPU
   ConvertProcs = CPU & " " & CPUText(PerCpu) & "-core CPU(s)"
End Function

Function ConvertMem (Memory)
   Dim MB, GB
   MB = Round(Memory / 1048576)
   GB = Round(Memory / (1048576*1024))
   ConvertMem = MB & " MB (" & GB & " GB)"
End Function

Function ConvertRole (Role)
   Select Case Role
	Case 0
	ConvertRole="Standalone Workstation"
	Case 1
	ConvertRole="Member Workstation"
	Case 2	
	ConvertRole="Standalone Server"
	Case 3 
	ConvertRole="Member Server"
	Case 4 
	ConvertRole="Backup Domain Controller"
	Case 5
	ConvertRole="Primary Domain Controller"
	Case Else
	ConvertRole="Unknown role identifier (" & Role & ")"
   End Select
End Function