Записывать вывод PowerShell в реальном времени во время выполнения релиза TFS - PullRequest
0 голосов
/ 06 июня 2018

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

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

enter image description here

Что я заметил, так это то, что выходные данные сценариев 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 Ответ

0 голосов
/ 07 июня 2018

Я могу воспроизвести эту проблему, основываясь на моем тесте Вывод в реальном времени не поддерживается для задачи 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).

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...