我正在编写一个简单的脚本来检查本地用户帐户。我想使用try_catch错误来处理错误,但我不明白为什么脚本中的catch块不会打印脚本中的警告消息。欢迎提供任何指导。
function checkAccount($user)
{
try {
Get-CimInstance Win32_UserAccount| Where-Object -Property Name -Contains $user |Select-Object -ExpandProperty Name -ErrorAction Stop
}
catch {
Write-Warning -Message "Oops, ran into an issue"
}
}
1条答案
按热度按时间e5nqia271#
Get-CimInstance
和Select-Object
[1] -所以您应该将-ErrorAction Stop
与这两个命令一起使用。$ErrorActionPreference
设置为'Stop'
:还要注意,我已经用
-eq
替换了-Contains
,因为-contains
操作符用于测试 * 集合 * 是否包含给定值,而您正在 * 逐个 * 处理用户帐户。相反,如果您的目的是执行 substring 匹配,则使用
-like *$user*
。注意事项:
相反,如果您的目的只是*测试 * 给定的用户帐户是否存在,则可以如下定义函数,使用approved verb
Test
,并相应地使函数返回[bool]
值($true
或$false
):[bool]
强制转换利用了PowerShell的to-Boolean转换规则,以及(非基元)对象转换为$true
,而 * 缺少输出 * 或$null
转换为$false
的事实-有关转换规则的摘要,请参阅this answer的底部部分。[1]
Get-CimInstance
通常应仅报告类名无效的错误,Select-Object -ExpandProperty
应仅报告属性名不存在的错误(与-Property
不同)。Where-Object
调用不应报告错误,因为它不强制指定属性的存在(但是,如果使用 invalid syntax,则任何cmdlet调用都将报告 statement-terminating 错误)。