我正在编写一个PowerShell脚本来更改本地帐户名。当然,第一步是检查帐户是否存在:
$user=[ADSI]"WinNT://$server/$oldName,user"如果帐户存在,那么就没有问题。但如果没有,我就会得到这样的错误:
格式-默认:检索成员>“distinguishedName”时出现以下异常:“找不到用户名。”+ CategoryInfo : NotSpecified:(:) format-default,ExtendedTypeSystemException + FullyQualifiedErrorId : CatchFromBaseGetMember,CatchFromBaseGetMember
我不知道如何查找该错误,报告“未找到的$oldName”之类的内容,然后继续进行。据我所知,它没有被抛到错误变量中,所以我无法搜索“用户名找不到”字符串。最后似乎忽略了这个错误。
我承认我在错误处理方面很薄弱。似乎有无数种失败的方法,我的用户在使用我的脚本时总是会找到新的方法。
发布于 2014-10-08 18:00:20
似乎该命令实际上正在抛出一个终止错误。来自about_preference_variables
“$ErrorActionPreference和ErrorAction公共参数都不会影响PowerShell对终止错误(那些停止cmdlet处理的错误)的响应。”
因此,当命令运行时,即使在脚本能够继续尝试并处理catch块之前,它也正在终止脚本。
有趣的是,如果把它放入变量中,这种行为就会停止发生。我很想知道是否有人有更好的答案,但从我所能看到的看来,这是一个基于变量结果的if语句。
$User = [ADSI]"WinNT://badserver/Name,user"
If (! $User.Name)
{
Throw "Issue retrieving user"
}
#Rest of script can continue here发布于 2014-10-09 03:00:44
您可以以这种方式检查用户名是否存在。
[ADSI]::Exists("WinNT://$Server/$UserName")它返回一个布尔值。如果用户存在,则为true,否则为false。
发布于 2018-04-25 14:49:54
我通过将命令封装在脚本块中并使用解决了类似的问题。
$ChangePassword = {([adsi]"WinNT://domain/$Username,user").ChangePassword($CurrentPassword, $NewPassword)}
try {
Invoke-Command -ScriptBlock $ChangePassword -ErrorAction Stop
}
catch {
# Error handling code
}https://stackoverflow.com/questions/26262384
复制相似问题