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

dev*_*ter 2 windows sql-server powershell wmi

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

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

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

BAC*_*CON 5

您可以使用-Class,-List以及-Namespace对参数Get-WmiObject小命令,看是否在指定的命名空间中存在的一个类:

$class = Get-WmiObject -Class 'Win32_BIOS' -List -Namespace 'root\cimv2';
$classExists = $class -ne $null;
Run Code Online (Sandbox Code Playgroud)

这是从我的答案的早期修订版中替代(但速度较慢)的方法:

$class = Get-WmiObject -List -Namespace 'root\cimv2' `
    | Where-Object { $_.Name -eq 'Win32_BIOS'; };
$classExists = $class -ne $null;
Run Code Online (Sandbox Code Playgroud)

回到我原来的答案,这是第三个选项,在我的测试中,如果命名空间或类无效,则不会抛出任何错误:

$class = Get-WmiObject -List | Where-Object {
    $_.__NAMESPACE -eq 'root\cimv2' -and $_.__CLASS -eq 'Win32_BIOS';
};
$classExists = $class -ne $null;
Run Code Online (Sandbox Code Playgroud)

请注意,$_.Name并且$_.__CLASS实际上是同义词.在每个代码片段中,如果找到,$class将包含ManagementClass您搜索的类的实例,否则$null.