首先,要么A)我没有对此进行足够的调查,或者B)我发现了一个需要一些时髦黑客的问题。顺便说一句,这是豪华的v1.0。
这就是:
大概一周前,我问过一个问题,即在powershell中重写一个EXE执行的输出,否则就不会被捕获。我很快得到了“2>& 1”,这解决了这个问题。
现在我遇到了另一个障碍,并希望看到你们中的一些人可以扔掉它们。
我在代码中使用try-catch块作为优秀的程序员应该。当我打电话给GPG(gnupg.org)时,传递一些命令如下:
try `
{
& $gpgExeLocation --import $keyFileName 2>&1 | out-file "theOutput.txt";
} `
-Catch `
{
write-host "$_";
}
我收到一个空白文本文件(theOutput.txt)。
但如果我在try-catch块中执行相同的 调用,则文本文件会按预期写入一些文本。
我想知道的是输出重定向到stdout的问题以及powershell捕获异常的方式 - 或者它是否是我的try-catch代码开始?
这是我的try-catch实现
function global:try
{
param
(
[ScriptBlock]$Command = $(Throw "The parameter -Command is required."),
[ScriptBlock]$Catch = { Throw $_ },
[ScriptBlock]$Finally = {}
)
& {
$local:ErrorActionPreference = "SilentlyContinue"
trap
{
trap
{
& {
trap { Throw $_ }
&$Finally
}
Throw $_
}
$_ | & { &$Catch }
}
&$Command
}
& {
trap { Throw $_ }
&$Finally
}
};
答案 0 :(得分:2)
您似乎正在使用带-Catch参数的自定义Try功能。介意分享您的实施,看看是否可能导致问题?
BTW我怀疑你的catch语句是否会被调用,除非你将$ lastexitode -ne 0的非终止错误条件转换为终止错误。在这种情况下,使用这样的函数可能会更好。我经常使用它(它非常方便):
function Get-CallStack {
trap { continue }
1..100 | foreach {
$var = Get-Variable -scope $_ MyInvocation
$var.Value.PositionMessage -replace "`n"
}
}
#--------------------------------------------------------------------
# Helper function to deal with legacy exe exit codes
#--------------------------------------------------------------------
function CheckLastExitCode {
param ([int[]]$SuccessCodes = @(0), [scriptblock]$CleanupScript=$null)
if ($SuccessCodes -notcontains $LastExitCode) {
if ($CleanupScript) {
"Executing cleanup script: $CleanupScript"
&$CleanupScript
}
$OFS = $NL = [System.Environment]::NewLine
throw "EXE RETURNED EXIT CODE ${LastExitCode}${NL}$(Get-CallStack)"
}
}
像这样使用它:
& $gpgExeLocation --import $keyFileName 2>&1 | out-file "theOutput.txt"
CheckLastExitCode