我有一些PowerShell脚本,其中包含以下内容:
$ErrorActionPreference = "stop"
trap { Write-Error $_.Exception; }
使用powershell重定向运算符从powershell窗口调用脚本时:
c:\somescript.ps1 2> c:\error.txt
它只会将错误打印到powershell窗口,而不会将其重定向到文件。如果我从脚本中删除$ ErrorActionPreference =“stop”,那么重定向会起作用,但这不是一个可行的选项,因为我们需要脚本在遇到任何错误时终止。我试过用'*>'也是,但这会产生相同的结果。
有没有办法将错误重定向到文件而无需更改所有脚本?
答案 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)