【问题标题】:Write realtime powershell output during TFS release execution在 TFS 发布执行期间写入实时 powershell 输出
【发布时间】:2018-11-15 23:39:48
【问题描述】:

在我们公司,我们使用 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."

你有没有遇到过这种情况?

问候

【问题讨论】:

  • 试试this,尤其是“在构建输出中显示警告和错误”。
  • 嗨@Christian.K。我试过这个链接,但它使用write-host(它不输出任何东西)。警告/错误日志有效,但部分进度条无效(我无法实时设置进度和输出)。
  • 嗯...我使用Write-Host,它可以工作(Write-Output 不起作用)。
  • 您使用的是哪个版本的 TFS?
  • TFS 2017 更新 3 (15.117.27024.0)

标签: powershell tfs


【解决方案1】:

我可以重现此问题,根据我的测试实时输出不支持PowerShell on Target Machines 任务。

Write-outputwrite-verbose -verbose 只能输出到控制台,但不是实时的,只有在 powershell 脚本完全执行后才会显示输出。

要显示实时输出,您可以使用Utility:PowerShell 任务而不是Deploy:PowerShell on Target Machines 任务。

因此,作为一种解决方法,您可以在要运行 powershell 脚本的目标计算机上部署一个代理,然后使用该代理运行带有 Utility:PowerShell 任务的 powershell 脚本来触发发布。


更新:

好吧,用Utility:PowerShell 任务找到另一个解决方法:

1.为目标计算机设置WinRM,参考WinRM configuration

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)。

【讨论】:

  • 嗨@Andy。这听起来不错;问题是,就我所见,Utility:PowerShell 组件只允许执行作为链接工件发布的脚本。在我的情况下,我需要执行一个位于目标机器上的脚本(所以我必须指向一个“文件系统”脚本,而不是一个“repo”脚本)
  • @gvdm 是的,我明白了。正如我上面所说,不幸的是,目前不支持Deploy:PowerShell on Target Machines 任务的实时输出。我在上面的答案中提到的解决方法应该对您有用,您可以将脚本签入 TFS,代理将首先将 PowerShell 脚本从 TFS 存储库/链接的工件下载到目标机器(代理机器),然后在该机器上运行它.
  • @gvdm 好吧,使用Utility:PowerShell 任务找到另一个解决方法,请参阅更新后的答案。
  • @gvdm 您是否通过更新的答案解决了问题?有更新吗?
  • 我没有时间测试它,但这是我必须做的未决测试:) 无论如何感谢您的回答,我会在测试后立即更新您
猜你喜欢
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 2013-08-22
  • 1970-01-01
相关资源
最近更新 更多