当$ ErrorActionPreference设置为停止时,您是否可以重定向PowerShell脚本中的错误?

时间:2016-12-14 00:33:35

标签: powershell

我有一些PowerShell脚本,其中包含以下内容:

$ErrorActionPreference = "stop"
trap { Write-Error $_.Exception; }

使用powershell重定向运算符从powershell窗口调用脚本时:

c:\somescript.ps1 2> c:\error.txt

它只会将错误打印到powershell窗口,而不会将其重定向到文件。如果我从脚本中删除$ ErrorActionPreference =“stop”,那么重定向会起作用,但这不是一个可行的选项,因为我们需要脚本在遇到任何错误时终止。我试过用'*>'也是,但这会产生相同的结果。

有没有办法将错误重定向到文件而无需更改所有脚本?

2 个答案:

答案 0 :(得分:2)

您的方法存在的问题是 $ErrorActionPreference = "stop"

  • 立即停止(中止)整个脚本调用它的命令c:\somescript.ps1 2> c:\error.txt

  • 这意味着重定向2> c:\error.txt 执行,并且错误消息显示在控制台中而不是在指定文件中捕获

解决方法有点麻烦:

您必须将所有脚本命令包装在一个try ... catch块中,如下所示:

$ErrorActionPreference = 'Stop'

try {

 # ... the entire rest of your script goes here

} catch {

  # !! This shouldn't be necessary, but if we left $ErrorActionPreference
  # !! 'Stop' in effect, the use of Write-Error itself would cause an 
  # !! - uncaught - terminating error.
  $ErrorActionPreference = 'Continue'

  # Write the error to the error stream.
  Write-Error $_

  # Exit the script with a nonzero exit code to signal failure.
  exit 1

}

需要在$ErrorActionPreference块中调用Write-Error之前重置catch以避免导致终止错误,这对我来说就像是一个错误(在PSv5.1和PS Core v6中测试过。 0-alpha13)。

答案 1 :(得分:0)

您可能希望查看使用Try Catch Finally进行错误捕获。

我取得了最大的成功。

Great TechNet Blog on this subject