我创建了一个基本脚本来将PC添加到域中。虽然这有效但仍存在错误,我想进行一些错误处理。
do {
Add-Computer -DomainName $Domain -Credential(get-credential)
} while (!$?)
使用!$?在最后一个命令不成功时运行while循环。
但是,会有各种错误返回。无论PC是否脱离网络,用户ID或密码不正确,还是域规范,我都希望能够处理这些错误并显示有意义的内容。
其中一个错误返回
Add-Computer : This command cannot be executed on target computer('PCName') due to following error: Logon failure: unknown user name or bad password. At line:1 char:13 + Add-Computer <<<< -DomainName $Domain -Credential(get-credential); + CategoryInfo : InvalidOperation: (PCNAME:String) [Add-Computer], InvalidOperationException + FullyQualifiedErrorId : InvalidOperationException,Microsoft.PowerShell.Commands.AddComputerCommand
使用错误处理程序,比如VBA,给出错误ID,并使用if语句,你可以用它做一些事情。
上述错误中的FullyQualifiedErrorID对于因各种原因收到的所有错误都是相同的,所以我不相信我可以使用它。
如何捕获特定错误&#34;登录失败:未知用户名或密码错误。&#34;或其他错误并显示有意义的消息,以便管理员采取适当的措施?
答案 0 :(得分:2)
如果没有别的,您应该能够使用错误消息来区分错误:
do {
$joined = $true
$cred = Get-Credential
try {
Add-Computer -DomainName $Domain -Credential $cred -ErrorAction Stop
} catch {
$joined = $false
switch -regex ($_.Exception.Message) {
'.*unknown user name.*' { ... }
'.*domain does not exist.*' { ... }
...
default { 'Unexpected error' }
}
}
} until ($joined)
请注意,您需要将错误操作设置为Stop
(-ErrorAction Stop
),否则错误将无法终止,因此无法捕获。
答案 1 :(得分:0)
将它与-ErrorAction参数一起使用:
Add-Computer ... -ErrorAction SilentlyContinue -ErrorVariable computerError
ErrorVariable是一个数组,因此产生的错误将存储在:
中$computerError[0]
要反复使用相同的变量,请使用var名称前面的+:
Add-Computer -ErrorVariable +manyErrors
最后一个错误总是:
$manyErrors[$manyerrors.count - 1]
要获取最后一个错误代码,如果它有相应的Win32错误代码,请运行以下
$manyErrors[$manyerrors.count - 1].Exception.InnerException.NativeErrorCode
然后,如果您收集了潜在的错误代码,您可以执行以下操作
if ($manyErrors[$manyerrors.count - 1].Exception.InnerException.NativeErrorCode -eq 1)
{
Write-Host error happened
}
elseif ($manyErrors[$manyerrors.count - 1].Exception.InnerException.NativeErrorCode -eq 2)
Write-Host other error happened
}