我创建了一个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)。但它给出了相同的输出。思考?
答案 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
}