Разница при работе с WMI через VBScript и PowerShell - PullRequest
3 голосов
/ 30 июля 2011

У меня тестовая Windows XP SP3 чистой установки с Power Shell.Это очень странная разница, если я получаю доступ к WMI из PowerShell и из VBScript.Из powershell:

Get-WmiObject 'Win32_OperatingSystem" | select Caption

Это корректно отображает «Windows XP Professional».И тот же код, написанный как VBScript:

WScript.Echo( GetObject( "winmgmts:Win32_OperatingSystem" ).Caption )

Отображает «ноль» O_O.Почему это происходит?

1 Ответ

5 голосов
/ 31 июля 2011

Вот эквивалент VBScript:

Set wmi = GetObject("winmgmts:")
Set objSet = wmi.InstancesOf("Win32_OperatingSystem")

For Each obj in objSet
    WScript.Echo obj.Caption
    Exit For
Next

Хотя существует только одна операционная система, запрос WMI всегда возвращает список.

Хорошо, теперь разница - с помощью командлета Get-WmiObject, поскольку существует только одна операционная система, вы получаете объект напрямую, а не список, когда вы делаете Get-WmiObject "Win32_OperatingSystem" (используйте GetType, чтобы увидеть, что это на самом деле тип System.Management.ManagementObject)

Поскольку будет несколько процессов, get-wmiobject win32_process даст массив. (используйте GetType, чтобы увидеть, что это тип System.Object[]

Следующее не даст никакого вывода:

(get-wmiobject win32_process).Caption

Принимая во внимание, что ниже будет:

(get-wmiobject win32_process)[0].Caption
...