在上一个技能中,我们演示了了新的 Get-CimInstance
命令缺少 Get-WmiObject
能够返回的重要的 “__Path
“ 属性。现在让我们将此属性添加回 Get-CimInstance
中。
Get-CimInstance
返回的每个实例的类型均为 [Microsoft.Management.Infrastructure.CimInstance]
类型,因此可以用 Update-TypeData
向该类型添加新属性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| $code = { $keys = $this.psbase.CimClass.CimClassProperties.Where{$_.Qualifiers.Name -eq 'Key'}.Name $pairs = foreach($key in $keys) { '{0}="{1}"' -f $key, $this.$key } $path = '\\{0}\{1}:{2}.{3}' -f $this.CimSystemProperties.ServerName.ToUpper(), $this.CimSystemProperties.Namespace.Replace("/","\"), $this.CimSystemProperties.ClassName, ($pairs -join ',')
return $path }
Update-TypeData -TypeName Microsoft.Management.Infrastructure.CimInstance -MemberType ScriptProperty -MemberName __Path -Value $code -Force
|
运行此代码后,所有 CIM 实例都将再次具有 __Path
属性。它略有不同,因为“新的” __Path
属性引用了所有键值。对于我们测试的所有用例,这都没有什么不同:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| PS> $old = Get-WmiObject -Class Win32_BIOS
PS> $new = Get-CimInstance -ClassName Win32_BIOS
PS> $old.__PATH \\DESKTOP-8DVNI43\root\cimv2:Win32_BIOS.Name="1.0.13",SoftwareElementID="1.0.13",SoftwareElementState=3,TargetOperatingSystem=0,Version="DELL - 20170001"
PS> $new.__Path \\DESKTOP-8DVNI43\root\cimv2:Win32_BIOS.Name="1.0.13",SoftwareElementID="1.0.13",SoftwareElementState="3",TargetOperatingSystem="0",Version="DELL - 20170001"
PS> [wmi]($old.__Path)
SMBIOSBIOSVersion : 1.0.13 Manufacturer : Dell Inc. Name : 1.0.13 SerialNumber : 4ZKM0Z2 Version : DELL - 20170001
PS> [wmi]($new.__Path)
SMBIOSBIOSVersion : 1.0.13 Manufacturer : Dell Inc. Name : 1.0.13 SerialNumber : 4ZKM0Z2 Version : DELL - 20170001
|