2016-05-06 6 views
0

Ich habe einfach eine Konsolen-App mit der Überprüfung der Argumentnummer am Anfang erstellt. Und nachdem das Paket bereitgestellt wurde, rufe ich diese Anwendung im Deployment-PowerShell-Skriptteil ohne Argument auf, um das Skript zu testen. Es scheint, Octopus erfasst nur den Exit-Code und zeigt an, dass es keine Ausgabe von der App gibt, die im Task-Log erfasst wurde.Wie kann man die Konsolen-App-Ausgabe in einem benutzerdefinierten PowerShell-Skript von Octopus erfassen?

static void Main(string[] args) 
    { 
     if (args.Length < 4) 
     { 
      Console.WriteLine("Invalid argument number"); 
      Environment.ExitCode = -1; 
      return; 
     } 
    } 

Allerdings, wenn ich einfach „‚Test‘echo“ setzen oder auch nur ‚test‘ Zeichenfolge im Skript wurde die Ausgabe in Octopus Bereitstellungsaufgabe Protokoll erfasst. Irgendeine Idee, wie die Konsolenanwendung im Skript korrekt protokolliert wird? Vielen Dank.

Antwort

0

Sorry, es ist nicht die Schuld von Octopus, Es ist eigentlich die Konsole App wurde für .Net Framework 4.6.1 gebaut, aber der Tentacle-Server hat nur 4.5.2. Wenn ich die App auf diesem Server über den Remote Desktop starte, erscheint die Fehlermeldung 4.6.1 .Net Framework fehlt. Erstellen Sie die App mit 4.5.2 neu, um dieses Problem zu beheben. Es war jedoch sehr schwierig das herauszufinden, da das Octopus Task Log nichts damit zu tun hat. Ich hoffe, dies würde in Zukunft jemandem anderen helfen.

0

Erstellen Sie eine Datei namens "yourpowershellfile.ps1" oder erstellen Sie den e-Deployment-Schritt "Führen Sie ein Skript aus".

Versuchen Sie, diese Powershell mit OctopusDeploy,

$FullPath = "C:\MyFolder" 
if ($OctopusEnvironmentName -ceq 'Development') 
{ 
    Write-Host "Console app will be execute" 
    & "$FullPath\yourconsolefile.exe" | Write-Host 
    Write-Host "Console app execution has finied" 
} 

Sie sollten versuchen, "Write-Output" statt "Write-Host" Überprüfen Sie die Octopus bereitstellen Protokoll Aufgabe.

+0

Danke, aber das Problem von mir war eigentlich gab es wirklich kein Protokoll als mein Ziel des Antrags auf 4.6.1 gesetzt .Net-Rahmen. Tentacle hat diese Version von .NET Framework nicht installiert, sodass die Anwendung nicht ausgeführt werden konnte. Nachdem ich mit der aktuellen Zielversion erstellt habe, führt Console.WriteLine den korrekten Job aus. – bigbearzhu

0

Wenn Sie diese Frage gefunden haben, weil Sie die Konsolenausgabe benötigen, nachdem die ausführbaren Dateien in Ihren Octopus-Bereitstellungsschritten ausgeführt wurden, können Sie den folgenden Code verwenden. Es dauerte ein wenig Forschung die folgende Funktion, die ich gerne wiederverwenden accross Octopus schreiben Schritte, wo ich die Konsolenausgabe benötigen:

Function Invoke-CmdCommand{ 
    param(
     [parameter(Mandatory=$true)] 
     [ValidateNotNullOrEmpty()] 
     [ValidateScript({(Test-Path $_.Trim('"').Trim(''''))})] 
     [string]$Executable, 
     [string]$Parameters = '', 
     [switch]$CmdEscape 
    ) 
    BEGIN{ 
     Write-Verbose "Start '$($MyInvocation.Mycommand.Name)'" 
     $nl = [Environment]::NewLine 
     $exitCode = 0 
     $cmdOutput = [string]::Empty 
     # next line wrap string in quotes if there is a space in the path 
     #$Executable = (Format-WithDoubleQuotes $Executable -Verbose:$([bool]($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent))) 
     $command = "{0} {1}" -f $Executable, $Parameters 
     Write-Verbose "COMMAND: $command" 
     $terminatePrompt = "/C" # https://ss64.com/nt/cmd.html 
     $comSpec = $env:ComSpec 

     if($CmdEscape.IsPresent){ 
      $command = "`"$command`"" 
      Write-Verbose "ESCAPED COMMAND: $command" 
     }   
    } 
    PROCESS{ 
     $cmdResult = .{ 
      # script block exec: dot does not create local scope as opposed to ampersand 
      .$comSpec $terminatePrompt $command '2>&1' | Out-String | Tee-Object -Variable cmdOutput 
      return $LastExitCode 
     } 

     $exitCode = $cmdResult[$cmdResult.length-1] 

     if($exitCode -ne 0){ 
      Write-Host "FAILED with ExitCode: $exitCode; ERROR executing the command:$nl$command$nl" -ForegroundColor Red 
      Write-Host "ERROR executing the command:$nl$command" -ForegroundColor Yellow 
     }else{ 
      Write-Host "SUCCESSFULLY executed the command:$nl$command$nl" 
     }   
    } 
    END{ 
     if($Host.Version.Major -le 3){ 
     return ,$cmdOutput # -NoEnumerate equivalent syntax since it is not available in version 2.0 
     }else{ 
      Write-Output -NoEnumerate $cmdOutput 
     } 
     Write-Verbose "End '$($MyInvocation.Mycommand.Name)'"   
    } 
} 

ANWENDUNG:

Invoke-CmdCommand -Executable (Join-Path (Split-Path $env:ComSpec) ping.exe) -Parameters 'localhost' 

OUTPUT:

Pinging localhost [::1] with 32 bytes of data:

Reply from ::1: time<1ms

Reply from ::1: time<1ms

Reply from ::1: time<1ms

Reply from ::1: time<1ms

Ping statistics for ::1: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms