通过VBScript和PowerShell使用WMI时的差异

gri*_*yvp 3 vbscript powershell wmi

我有一个测试Windows XP SP3干净安装与电源外壳.如果我从PowerShell和VBScript访问WMI,这是一个非常奇怪的区别.来自powershell:

Get-WmiObject 'Win32_OperatingSystem" | select Caption
Run Code Online (Sandbox Code Playgroud)

这正确显示"Windows XP Professional".和编写为VBScript的代码相同:

WScript.Echo( GetObject( "winmgmts:Win32_OperatingSystem" ).Caption )
Run Code Online (Sandbox Code Playgroud)

显示"null"O_O.为什么会这样?

man*_*lds 5

这是VBScript的等价物:

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

For Each obj in objSet
    WScript.Echo obj.Caption
    Exit For
Next
Run Code Online (Sandbox Code Playgroud)

虽然只有一个操作系统,但WMI查询始终返回一个列表.

好的,现在,差异 - 使用Get-WmiObjectcmdlet,因为只有一个操作系统,所以你直接得到对象而不是列表Get-WmiObject "Win32_OperatingSystem"(使用GetType来看这实际上是类型System.Management.ManagementObject)

由于会有多个进程,get-wmiobject win32_process会给出一个数组.(使用GetType查看此类型System.Object[]

以下内容不会给出任何结果:

(get-wmiobject win32_process).Caption
Run Code Online (Sandbox Code Playgroud)

以下是:

(get-wmiobject win32_process)[0].Caption
Run Code Online (Sandbox Code Playgroud)