Как записать вывод консольного приложения в пользовательский сценарий PowerShell Octopus?

Я просто создал консольное приложение с проверкой номера аргумента в самом начале. А после развертывания пакета в части сценария развертывания PowerShell я напрямую вызываю это приложение без аргументов для тестирования сценария. Кажется, что Octopus просто фиксирует код выхода и показывает, что в журнале задач вообще нет вывода из приложения.

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

Однако, если я просто вставлю в скрипт «echo 'test'» или даже просто 'test' строку, вывод будет зафиксирован в журнале задачи развертывания Octopus. Есть идеи, как правильно регистрировать консольное приложение в скрипте? Спасибо.


person bigbearzhu    schedule 06.05.2016    source источник


Ответы (4)


Извините, это не вина Octopus. На самом деле консольное приложение было создано для .Net framework 4.6.1, но на сервере щупалец только 4.5.2. Когда я запускаю приложение на этом сервере через удаленный рабочий стол, появляется сообщение об ошибке, в котором говорится, что 4.6.1 .Net framework отсутствует. Перестройте приложение с помощью версии 4.5.2, которая устранила эту проблему. Однако выяснить это было очень сложно, потому что журнал задач Octopus не имеет к этому никакого отношения. Надеюсь, это поможет кому-то еще в будущем.

person bigbearzhu    schedule 06.05.2016

Создайте файл с именем «yourpowershellfile.ps1» или создайте шаг развертывания «Запустить сценарий».

Попробуйте этот powershell с 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"
}

Вы должны попробовать «Write-Output» вместо «Write-Host». Просмотрите журнал задачи развертывания Octopus.

person Ozgur Kaya    schedule 09.05.2016
comment
Спасибо, но моя проблема заключалась в том, что на самом деле журнала не было, так как моя цель приложения настроена на 4.6.1 .Net framework. На щупальце не установлена ​​эта версия .Net framework, поэтому приложение не запустилось. После сборки с текущей целевой версией Console.WriteLine выполняет правильную работу. - person bigbearzhu; 10.05.2016

Если вы нашли этот вопрос, потому что вам действительно нужно получить вывод консоли после запуска исполняемых файлов на этапах развертывания Octopus, вы можете использовать следующий код. Потребовалось немного исследований, чтобы написать следующую функцию, которую я с удовольствием повторно использую на шагах Octopus, где мне нужен вывод консоли:

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)'"        
    }
}

ИСПОЛЬЗОВАНИЕ:

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

ВЫВОД:

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

person Emil    schedule 06.03.2018

Мы просто добавляем в пакет файл Deploy.ps1 со следующим кодом:

& .\MyCompany.Foo.Bar.exe 2>&1

Ресурсы: Что означает 2›&1 в оболочке?

person Space Monkey    schedule 03.07.2019