Как записать вывод консольного приложения в пользовательский сценарий PowerShell Octopus?
Автор вопроса: bigbearzhuОтветов: 4
Я просто создал консольное приложение с проверкой номера аргумента в самом начале. А после развертывания пакета в части сценария развертывания PowerShell я напрямую вызываю это приложение без аргументов для тестирования сценария. Кажется, что Octopus просто фиксирует код выхода и показывает, что в журнале задач вообще нет вывода из приложения.
Однако, если я просто вставлю в скрипт "echo 'test'" или даже просто 'test' строку, вывод будет зафиксирован в журнале задачи развертывания Octopus. Есть идеи, как правильно регистрировать консольное приложение в скрипте? Спасибо.
Извините, это не вина 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)'"
}
}
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 со следующим кодом: