确定给定命名空间是否存在wmiobject类

时间:2014-02-10 22:38:00

标签: sql-server windows powershell wmi

我有一个命名空间,我想用它来验证WMI对象是否存在,然后再在代码中向下运行Get-WmiObject。例如,我想在它上面抛出SSRS 2012的命名空间,如果它在机器上不存在,那么我将尝试SSRS 2008 R2的下一个命名空间。

有没有办法通过猜测命名空间来检查类的存在,如果它不存在则不会抛出错误?

  1. 我不想使用try-catch作为解决方案。我想知道一种方法,我可以得到一个简单的布尔结果,告诉我该类是否存在于此命名空间中。
  2. 我不想使用SilentlyContinue作为解决方案。
  3. 这将从SQL代理作业中的Powershell作业步骤执行。这有时会以不同于纯Powershell的方式处理错误,这也是我担心上述#1和2的原因。

2 个答案:

答案 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中以处理错误并相应地显示消息。