Записать вывод PowerShell в реальном времени во время выполнения релиза TFS

В нашей компании мы используем TFS 2017 (обновление 1) для создания и выпуска наших продуктов. Релизная часть состоит из нескольких этапов, которые включают в себя выполнение некоторых скриптов Powershell.

Вот так я настраиваю шаг PS.

Что я заметил, так это то, что выходные данные сценариев powershell записываются не в реальном времени во время выполнения, а вместе в конце задачи PS. Это очень раздражает в случае долго выполняющихся сценариев, так как мы не можем видеть динамический ход выполнения задачи, но нам нужно дождаться завершения задачи, чтобы увидеть результаты.

Я написал несколько простых сценариев PS для устранения этой проблемы, но ни один из них не использовал write-host (это вообще ничего не пишет, даже в конце задания) ни используя write-output ни с write-verbose -verbose позволяет мне писать вывод в реальном времени. Это один пример сценария, который я попробовал, но безуспешно.

Write-Output "Begin a lengthy process..."
$i = 0
while ($i -le 100)
{
  Start-Sleep 1
  Write-Output "Inner code executed"
  $i += 10
}
Write-Output "Completed."

Вы когда-нибудь оказывались в такой ситуации?

С уважением

1 ответ

Решение

Я могу воспроизвести эту проблему, основываясь на том, что мой тестовый вывод в реальном времени не поддерживается для PowerShell on Target Machines задача.

Write-output или же write-verbose -verbose просто может выводить на консоль, но это не в реальном времени, вывод отображается только после полного выполнения сценария powershell.

Для отображения результатов в реальном времени вы можете использовать Utility:PowerShell задача вместо Deploy:PowerShell on Target Machines задача.

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


ОБНОВИТЬ:

Ну, найдите другой обходной путь с Utility:PowerShell задача:

1.Установите WinRM для целевых компьютеров, обратитесь к конфигурации WinRM

2. Скопируйте целевой PS-скрипт на целевой компьютер (D:\TestShare\PStest.ps1 в приведенном ниже примере)

3. Создайте сценарий PowerShell для вызова Powershell.exe чтобы запустить целевой скрипт powershell на целевой машине, см. пример ниже:

Param(
  [string]$computerName = "ICTFS2015.test.com",
)
$Username = "domain\usename"
$Password = ConvertTo-SecureString "Possword" -AsPlainText -Force

$cred = New-Object System.Management.Automation.PSCredential($Username,$password)

Invoke-Command -ComputerName $computerName  -Credential $cred -ScriptBlock {Invoke-Expression -Command:"powershell.exe /c 'D:\TestShare\PStest.ps1'"}

4. Добавить Utility:PowerShell задача для запуска выше сценария PowerShell. (Вы можете проверить или запустить Inline Script).

Другие вопросы по тегам