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