【问题标题】:Cmdlet does not respect -ErrorAction flag or continue correctly when runCmdlet 不尊重 -ErrorAction 标志或在运行时正确继续
【发布时间】:2021-09-22 16:32:41
【问题描述】:

我正在更新我们的计算机 AD 连接脚本以检查 AD 中的重复对象,但遇到了一些问题。

我的主要问题是我想知道给定名称 (-Identity) 的 AD 计算机对象是否为空,而不是像我期望的那样简单地检查值(C# 背景)尝试检查时出现脚本错误,因为对象不存在。

当然,我的下一个尝试是设置 ErrorActionPreference。我只想使用 -ErrorAction 为这个 cmdlet 执行此操作,但无论出于何种原因,该 cmdlet 似乎完全忽略了该标志,而是无论如何都遵循 $ErrorActionPreference 变量。以下片段:

if ((Get-ADComputer -ErrorAction 'SilentlyContinue' -Identity "whatever") -eq $null) { Write-Host "success" }

但是使用上面的代码它不会继续。如果我将 $ErrorActionPreference 更改为 'SilentlyContinue' 或 Continue/Inquire 并告诉代码继续,它会完成并且没有按预期显示错误,但它没有完成 Write-Host。这意味着我可能在“if”之后放置的任何函数也不会完成。

我对 PowerShell 相当陌生,所以我确定我误解了其中一些功能如何处理错误。从我见过的其他一些 sn-ps 来看,我可能需要切换到 Try/Catch,但对于这种基本的东西来说,这感觉非常笨拙。任何指导将不胜感激。

【问题讨论】:

  • 不熟悉 Get-ADComputer,但如果在 -identity 标志未找到任何内容时它会出错,则可以将其放入 try..catch 中,可以有效地复制您的 if 语句

标签: powershell error-handling active-directory


【解决方案1】:

Powershell 不会使事情复杂化。 Get-AdComputer如果找不到目标会报错,所以只测试成功。

If (Get-AdComputer -Identity "whatever" -ErrorAction SilentlyContinue) { Write-Host "Success" }

如果您想抑制在找不到对象时发生的错误,请使用-ErrorAction 与上述或使用-ErrorAction Stop 以及Else {Throw...}Try...Catch 选项自行处理错误。

我倾向于将Try...Catch 用于除最简单的脚本之外的所有脚本,因为它可以控制输出 - Catch 块中的 $_ 变量包含错误代码。

Try {
    Get-AdComputer -Identity "whatever" -ErrorAction Stop
    Write-Host "Success"
}
Catch {
    Write-Host "Failed with error: $_"
}

【讨论】:

  • 在上面的代码 sn-p 中,您遇到了我在问题中提到的完全相同的问题。 PowerShell 中完全忽略了 -ErrorAction。您可以测试自己——只需完全按照“随便”运行该行代码即可。无论您将其设置为 SilentlyContinue 还是 Stop,它都会给出完全相同的结果 - 无论您的 $ErrorActionPreferences 变量设置为什么。
  • 例如,您可以在花括号之外添加一个额外的 Write-Host “Failure”。当同时使用 continue 和 stop 选项运行时,它会将失败写入控制台。
  • 你到底想达到什么目的?
  • 如果给定名称的计算机对象在 AD 中已经存在,则创建它。否则,暂停并给出对象已经存在的反馈。我通过使用 Try/Catch 来解决 -ErrorAction 的问题,即使它涉及更多。令人沮丧的是,与例如 C# 相比,尝试与 null 进行比较会引发错误,而不仅仅是继续。真的很草率。
猜你喜欢
  • 2017-05-07
  • 2015-01-18
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 2019-04-16
  • 1970-01-01
相关资源
最近更新 更多