2013-09-25 3 views
0

IIS에서 내 보낸 PFX 인증서를 Apache에서 더 잘 작동하는 인증서 형식으로 변환하는 PowerShell 스크립트를 만들었습니다. 이 스크립트는 openssl.exe의 인스턴스를 일련의 옵션과 함께 호출합니다. 완벽하게 작동합니다.Start-Job은 정상적으로 완료되지만 출력은 오류로보고됩니다.

저는 이제 사용자 친화적 인 출력과 오류 처리를 위해 노력하고 있습니다. 내가 말했듯이 그게 잘 작동했다, 처음에 호출-명령에서 프로세스를 실행 하였다 : OpenSSL을에서 간단한 성공 메시지를 반환

[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 

(이 경우, "MAC 확인 확인"). 내 목표는 그 메시지를 완전히 억제하고 덜 간결한 것으로 대체하는 것입니다. 지금 플래그 것 같았다 제외하고,

[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 

... 같은 성공 메시지가 나타 : thusly 히 시작-작업을 사용하여 동일한 프로세스를 실행하면 해당 나는 그것을 할 수있는 방법을 찾기 위해 아직하지만 난 찾았어요 오류 (빨간색 텍스트)과 같이

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 

나는 다음 '정지'로 시작 - 작업의 ErrorAction을 정의하고 그들 (캐치에 대한 System.Exception 사용) 시도/잡기에 전체를 포장했습니다. 그러나 같은 결과를 가져다주었습니다. 생각?

답변

0

$ error 개체를 '+'로 분할 한 후 실제 오류 메시지가 문자열에 포함되어 있으면 다른 메시지를 throw하여 문자열로 변환하여 필요한 결과를 얻을 수있었습니다. 가장 우아한 해결책은 아니지만 내가 있어야 할 곳을 찾는다.

[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 
} 
1

Start-Job이 성공적으로 시작되기 때문에 Start-Job에서 -ErrorAction을 사용하면이 경우 도움이되지 않습니다. openssl.exe를 실행 한 직후에 $LastExitCode을 출력하여 exe가 0이 아닌 종료 코드를 반환하는지 확인하십시오. exe가 PowerShell이 ​​오류라고 해석하는 stderr에 쓰고있는 것처럼 보입니다.

+0

0 종료 코드를 전송하는 것으로 보입니다. 그냥 실행 중 '$ 명령 | openssl.exe; 호스트 쓰기 $ LastExitCode 반환 : 'OpenSSL> MAC 확인 OK; OpenSSL> 0 –

+0

다음은 stderr에 작성해야합니다. Console.Error에 쓰지만 0을 반환하는 간단한 C# 콘솔 앱을 만들었습니다. Start-Job을 통해 실행할 때 같은 오류가 발생합니다. –