如何将变量严格键入为特定 WMI class?
How do I strictly-type a variable as a specific WMI class?
在大多数情况下,您对函数参数的期望是 [wmiclass]
。但是,我正在使用自定义 class 的自定义命名空间中工作。当我使用 Get-Member
时,它显示类型为:
System.Management.ManagementClass#ROOT\namespace\class_name
如何将 WMI class 指定为变量类型?此示例不起作用:
param(
[wmiclass#root\namespace\class_name]
$Class
)
这个returns
Unable to find type [System.Management.ManagementClass#ROOT\namespace\class_name].
为了这个问题的目的,假设我正在尝试定位
ROOT\cimv2\Win32_Service
标记 c#
因为它是切线相关的,我很好奇这是否在那里得到解决
你能做到吗?
Param (
[PsTypeName("System.Management.ManagementClass#ROOT\namespace\class_name")]
$Class
)
或者,如果使用 CIM 而不是 WMI,则:
Param (
[PsTypeName("System.Management.Infrastructure.CimInstance#root/namespace/class_name")]
$Class
)
测试用例:
function test {
Param (
[psTypename("System.Management.ManagementClass#ROOT\cimv2\StdRegProv")]
$mine
)
$mine
}
$reg = [wmiclass]"\.\root\cimv2:StdRegprov"
$reg | gm
#outputs: TypeName: System.Management.ManagementClass#ROOT\cimv2\StdRegProv
[wmiclass]$wmi = ""
$wmi | gm
# outputs: TypeName: System.Management.ManagementClass#\
test $wmi
# Errors: test : Cannot bind argument to parameter 'mine', because PSTypeNames of the argument do not match the PSTypeName
# required by the parameter: System.Management.ManagementClass#ROOT\cimv2\StdRegProv.
# At line:1 char:6
# + test $wmi
# + ~~~~
# + CategoryInfo : InvalidArgument: (:) [test], ParameterBindingArgumentTransformationException
# + FullyQualifiedErrorId : MismatchedPSTypeName,test
test $reg
# outputs: NameSpace: ROOT\cimv2
# Name Methods Properties
# ---- ------- ----------
# StdRegProv {CreateKey, Delet... {}
PowerShell V2 测试:
function testv2 {
param(
[ValidateScript({($_ | Get-Member)[0].typename -eq 'System.Management.ManagementClass#ROOT\cimv2\StdRegProv'})]
$mine
)
$mine
}
testv2 $reg
# outputs: NameSpace: ROOT\cimv2
#
# Name Methods Properties
# ---- ------- ----------
# StdRegProv {CreateKey, Delet... {}
testv2 $wmi
# Error: testv2 : Cannot validate argument on parameter 'mine'. The "($_ | gm)[0].typename -eq 'System.Management.ManagementClas
# s#ROOT\cimv2\StdRegProv'" validation script for the argument with value "" did not return true. Determine why the valid
# ation script failed and then try the command again.
# At line:1 char:7
# + testv2 <<<< $wmi
# + CategoryInfo : InvalidData: (:) [testv2], ParameterBindingValidationException
# + FullyQualifiedErrorId : ParameterArgumentValidationError,testv2
在大多数情况下,您对函数参数的期望是 [wmiclass]
。但是,我正在使用自定义 class 的自定义命名空间中工作。当我使用 Get-Member
时,它显示类型为:
System.Management.ManagementClass#ROOT\namespace\class_name
如何将 WMI class 指定为变量类型?此示例不起作用:
param(
[wmiclass#root\namespace\class_name]
$Class
)
这个returns
Unable to find type [System.Management.ManagementClass#ROOT\namespace\class_name].
为了这个问题的目的,假设我正在尝试定位
ROOT\cimv2\Win32_Service
标记 c#
因为它是切线相关的,我很好奇这是否在那里得到解决
你能做到吗?
Param (
[PsTypeName("System.Management.ManagementClass#ROOT\namespace\class_name")]
$Class
)
或者,如果使用 CIM 而不是 WMI,则:
Param (
[PsTypeName("System.Management.Infrastructure.CimInstance#root/namespace/class_name")]
$Class
)
测试用例:
function test {
Param (
[psTypename("System.Management.ManagementClass#ROOT\cimv2\StdRegProv")]
$mine
)
$mine
}
$reg = [wmiclass]"\.\root\cimv2:StdRegprov"
$reg | gm
#outputs: TypeName: System.Management.ManagementClass#ROOT\cimv2\StdRegProv
[wmiclass]$wmi = ""
$wmi | gm
# outputs: TypeName: System.Management.ManagementClass#\
test $wmi
# Errors: test : Cannot bind argument to parameter 'mine', because PSTypeNames of the argument do not match the PSTypeName
# required by the parameter: System.Management.ManagementClass#ROOT\cimv2\StdRegProv.
# At line:1 char:6
# + test $wmi
# + ~~~~
# + CategoryInfo : InvalidArgument: (:) [test], ParameterBindingArgumentTransformationException
# + FullyQualifiedErrorId : MismatchedPSTypeName,test
test $reg
# outputs: NameSpace: ROOT\cimv2
# Name Methods Properties
# ---- ------- ----------
# StdRegProv {CreateKey, Delet... {}
PowerShell V2 测试:
function testv2 {
param(
[ValidateScript({($_ | Get-Member)[0].typename -eq 'System.Management.ManagementClass#ROOT\cimv2\StdRegProv'})]
$mine
)
$mine
}
testv2 $reg
# outputs: NameSpace: ROOT\cimv2
#
# Name Methods Properties
# ---- ------- ----------
# StdRegProv {CreateKey, Delet... {}
testv2 $wmi
# Error: testv2 : Cannot validate argument on parameter 'mine'. The "($_ | gm)[0].typename -eq 'System.Management.ManagementClas
# s#ROOT\cimv2\StdRegProv'" validation script for the argument with value "" did not return true. Determine why the valid
# ation script failed and then try the command again.
# At line:1 char:7
# + testv2 <<<< $wmi
# + CategoryInfo : InvalidData: (:) [testv2], ParameterBindingValidationException
# + FullyQualifiedErrorId : ParameterArgumentValidationError,testv2