Diferencia al trabajar con WMI a través de VBScript y PowerShell
(1)
Tengo una prueba de instalación limpia de Windows XP SP3 con power shell. Es una diferencia muy extraña si accedo a WMI desde PowerShell y desde VBScript. De powershell:
Get-WmiObject ''Win32_OperatingSystem" | select Caption
Esto muestra correctamente "Windows XP Professional". Y el mismo código escrito como VBScript:
WScript.Echo( GetObject( "winmgmts:Win32_OperatingSystem" ).Caption )
Muestra "nulo" O_O. ¿Por qué sucede esto?
Aquí está el equivalente de VBScript:
Set wmi = GetObject("winmgmts:")
Set objSet = wmi.InstancesOf("Win32_OperatingSystem")
For Each obj in objSet
WScript.Echo obj.Caption
Exit For
Next
Aunque solo hay un sistema operativo, una consulta WMI siempre devuelve una lista.
Bien, ahora, la diferencia: usando el cmdlet Get-WmiObject
, dado que solo hay un sistema operativo, obtienes el objeto directamente en lugar de una lista cuando haces Get-WmiObject "Win32_OperatingSystem"
(usa GetType para ver que esto es en realidad de tipo System.Management.ManagementObject
)
Como habrá múltiples procesos, get-wmiobject win32_process
daría una matriz. (use GetType para ver que esto sea de tipo System.Object[]
Lo siguiente no daría ningún resultado:
(get-wmiobject win32_process).Caption
Mientras que el siguiente sería:
(get-wmiobject win32_process)[0].Caption