我有一个命名空间,我想在代码中进一步针对它运行 Get-WmiObject
之前使用它来验证 WMI 对象的存在。例如,我想将 SSRS 2012 的命名空间扔给它,如果它在机器上不存在,那么我将尝试 SSRS 2008 R2 的下一个命名空间。
有没有办法通过猜测命名空间来检查类是否存在,如果它不存在则不抛出错误?
- 我不想使用 try-catch 作为解决方案。我想知道一种可以获得简单 bool 结果的方法,该结果告诉我该类是否存在于此命名空间中。
- 我也不想使用 SilentlyContinue 作为解决方案。
- 这将从 SQL 代理作业中的 Powershell 作业步骤执行。这有时会以不同于纯 Powershell 的方式处理错误,这也是我担心上面#'s 1 和 2 的原因。
最佳答案
您可以使用 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 ,这是第三个选项,在我的测试中,如果 namespace 或类无效,则不会抛出任何错误:
$class = Get-WmiObject -List | Where-Object {
$_.__NAMESPACE -eq 'root\cimv2' -and $_.__CLASS -eq 'Win32_BIOS';
};
$classExists = $class -ne $null;
注意 $_.Name
和 $_.__CLASS
实际上是同义词。在每个代码片段中,$class
将包含一个 ManagementClass
您搜索的类的实例(如果找到),否则为 $null
。
关于sql-server - 确定给定命名空间是否存在 wmiobject 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21689363/