powershell vbscript wmi

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