我正在使用PowerShell脚本来更改本地帐户名称。当然,第一步是检查帐户是否存在:
$user=[ADSI]"WinNT://$server/$oldName,user"
如果帐户存在,则没问题。但如果它没有,那么我得到这个错误:
format-default:检索成员>" distinguishedName"时出现以下异常:"找不到用户名。" + CategoryInfo:NotSpecified:(:) [format-default],ExtendedTypeSystemException + FullyQualifiedErrorId: CatchFromBaseGetMember,Microsoft.PowerShell.Commands.FormatDefaultCommand
我无法弄清楚如何查找该错误,报告类似" $ oldName not found"并继续。据我所知,它并没有被抛入一个错误变量,所以我无法搜索到一个"无法找到用户名"串。 Try-Catch-Finally似乎忽略了错误。
我承认我在错误处理方面表现不佳。似乎有无数种方法可以使某些东西失败,而且我的用户在使用我的脚本时总能找到新的东西。
答案 0 :(得分:2)
看起来该命令实际上是在抛出一个终止错误。来自about_preference_variables
" $ ErrorActionPreference和ErrorAction公共参数都没有 影响Windows PowerShell如何响应终止错误(那些 停止cmdlet处理)。"
因此,当命令运行时,即使在继续尝试处理catch块之前,它也会终止脚本。
有趣的是,如果将其置于变量中,则此行为将停止发生。我很想知道是否有人有更好的答案,但看起来我能看到的解决方案将是基于变量结果的if语句。
$User = [ADSI]"WinNT://badserver/Name,user"
If (! $User.Name)
{
Throw "Issue retrieving user"
}
#Rest of script can continue here
答案 1 :(得分:0)
您可以通过这种方式检查用户名是否存在
[ADSI]::Exists("WinNT://$Server/$UserName")
返回一个布尔值。如果用户存在,则为true,否则为false。
答案 2 :(得分:0)
我通过将命令包装在脚本块中并使用Invoke-Command解决了类似的问题。
$ChangePassword = {([adsi]"WinNT://domain/$Username,user").ChangePassword($CurrentPassword, $NewPassword)}
try {
Invoke-Command -ScriptBlock $ChangePassword -ErrorAction Stop
}
catch {
# Error handling code
}