我有一个命名空间,我想用它来验证WMI对象是否存在,然后再在代码中向下运行Get-WmiObject
。例如,我想在它上面抛出SSRS 2012的命名空间,如果它在机器上不存在,那么我将尝试SSRS 2008 R2的下一个命名空间。
有没有办法通过猜测命名空间来检查类的存在,如果它不存在则不会抛出错误?
答案 0 :(得分:5)
您可以使用Get-WmiObject
cmdlet的-Class
,-List
和-Namespace
参数来查看指定命名空间中是否存在单个类:
$class = Get-WmiObject -Class 'Win32_BIOS' -List -Namespace 'root\cimv2';
$classExists = $class -ne $null;
以下是我的答案的an earlier revision替代(但速度较慢)的方法:
$class = Get-WmiObject -List -Namespace 'root\cimv2' `
| Where-Object { $_.Name -eq 'Win32_BIOS'; };
$classExists = $class -ne $null;
回到my original answer,这是第三个选项,在我的测试中,如果命名空间或类无效,则不会抛出任何错误:
$class = Get-WmiObject -List | Where-Object {
$_.__NAMESPACE -eq 'root\cimv2' -and $_.__CLASS -eq 'Win32_BIOS';
};
$classExists = $class -ne $null;
请注意,$_.Name
和$_.__CLASS
实际上是同义词。在每个代码段中,$class
将包含您搜索的类的ManagementClass
实例(如果找到),否则为$null
。
答案 1 :(得分:0)
当找不到类时,以及当您无权查询该类时,上述代码将会出错。所以最好将它包装在try catch中以处理错误并相应地显示消息。