Start-Job完成OK但输出报告为错误

时间:2013-09-25 22:30:47

标签: powershell openssl pfx

我创建了一个PowerShell脚本,将从IIS导出的PFX证书转换为可以更好地与Apache配合使用的证书格式。该脚本使用一系列选项调用openssl.exe的实例。它工作得很好。

我现在正在努力处理用户友好的输出以及一些错误处理。我最初在Invoke-Command下运行这个过程,正如我所说,它运行良好:

[string]$Command = " pkcs12 -in '$PFXFile' -nocerts -out '$key' -password pass:$importpw -passout pass:$pempw"
(Invoke-Command -ScriptBlock {param($arg)$arg|openssl.exe} -ArgumentList $Command)|Out-Null

这将从OpenSSL返回一个简单的成功消息(在这种情况下,“MAC验证正常”)。我的目标是完全压制这个消息,并用一些不那么简洁的东西替换它。我还没有找到一种方法来做到这一点,但我确实发现,当使用Start-Job运行相同的过程时:

[string]$Command = " pkcs12 -in '$PFXFile' -nocerts -out '$key' -password pass:$importpw -passout pass:$pempw"
Start-Job -ScriptBlock {param($arg)$arg|openssl.exe} -Name MakeCert -ArgumentList $Command
Get-Job|Wait-Job|Receive-Job

...同样的成功消息出现了,除了它现在似乎被标记为错误(红色文字):

    Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
    --     ----            -------------   -----         -----------     --------             -------
    1      MakeCert        BackgroundJob   Running       True            localhost            param($arg)$arg|openssl.exe
    MAC verified OK
    + CategoryInfo          : NotSpecified: (MAC verified OK:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
    + PSComputerName        : localhost

然后我尝试将Start-Job的ErrorAction定义为'stop',然后将整个事件包装在try / catch中(对catch使用System.Exception)。但它给出了相同的输出。思考?

2 个答案:

答案 0 :(得分:1)

在这种情况下,在Start-Job上使用-ErrorAction将无济于事,因为Start-Job已成功启动。在执行openssl.exe之后,输出$LastExitCode以查看exe是否返回非0退出代码。它看起来像exe写入stderr,PowerShell将其解释为错误。

答案 1 :(得分:0)

通过将$ error对象转换为字符串,将其拆分为“+”,然后在包含任何实际错误消息的情况下抛出不同的消息,我能够获得所需的结果在字符串中。不是最优雅的解决方案,但让我到达我需要的地方。

[string]$out = $Error[0]
$message = $out.Split('+')[0]
if($out -like '*invalid*' -or $out -like '*error*')
{
    Write-Host 'ERROR:'
    Write-Host $command -Fore Yellow -Back Black
    Write-Host $message -Fore Red -Back Black
    throw('Process failed')
}
else
{
    Write-Host $message -Fore White -Back DarkGreen
}