Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: bigbearzhuОтветов: 4

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

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

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

powershellconsole-applicationoctopus-deploy

Ответы

Ответ 1 · bigbearzhu

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

Ответ 2 · Ozgur Kaya

Создайте файл с именем "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.

Ответ 3 · Emil

Если вы нашли этот вопрос, потому что вам действительно нужно получить вывод консоли после запуска исполняемых файлов на этапах развертывания 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

Ответ 4 · Space Monkey

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы