首页 > 解决方案 > Powershell 脚本模块/命令行开关中的 $Error 变量

问题描述

首先,让我从我想要实现的目标开始。

我正在编写一个 PowerShell 脚本模块(我们称之为 Get-FdkUser),它在内部调用 Get-AdUser,并且应该重试几次,以防引发除 certian Exception 之外的所有异常。当然,因为它正在重试,所以不应该记录错误——如果重试不起作用,它只是一个错误。此 PowerShell 脚本模块用作脚本的一部分以通过 >100,000 个用户。除了 AD 数据,我还从 Exchange 和 AzureAD 中提取数据。

在实现重试之前,我通过检查 $Error 变量来记录任何类型的错误。基本上是这样的

$Error.clear()
Get-ADUser
Get-Mailbox
Get-AzureADUser
if($Error.Count -gt 0) {
  Do something
}

奇迹般有效。

现在,我的问题...

1)在 PowerShell 脚本模块中,似乎没有填充 $Error 变量。它仅在执行命令行开关后填充。您可以通过检查以下代码来复制它。即使没有我的要求,我也觉得这很奇怪。看来我永远不能在 PowerShell 脚本模块中使用 $Error 变量?

文件:ErrorTest.psm1

function Get-FdkTest
{
  [CmdletBinding()]
  Param
  ()

  try {
      $temp[-1]
  } catch {
      Write-Host "there was an error"
  }
  Write-Host "Commandlet error count $($Error.Count)"

}
Export-ModuleMember -Function *

脚本

Import-Module .\ErrorTest.psm1 -Force
$Error.Clear()
Get-FdkTest
"Error count outside of commandlet $($Error.Count)"

输出

there was an error
Commandlet error count 0
Error count outside of commandlet 1

2)如前所述,可以通过重试修复的异常甚至不应该浮出水面。理想情况下,我想将它们从 $Error 变量中删除或避免它们被捕获。除了由于 1) 这无论如何都不起作用,也许有更好的方法来解决这个问题。

最后,这是我正在运行的 PowerShell 版本。

Name                           Value
----                           -----
PSVersion                      5.1.15063.1029
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.15063.1029
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

标签: powershellerror-handlingmodulepowershell-5.0

解决方案


推荐阅读