代码之家  ›  专栏  ›  技术社区  ›  gvdm

在tfs释放执行期间写入实时powershell输出

  •  0
  • gvdm  · 技术社区  · 6 年前

    在我们公司,我们使用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 回复  |  直到 6 年前
        1
  •  2
  •   Andy Li-MSFT    6 年前

    根据我的测试,我可以复制这个问题 实时输出 不支持 PowerShell on Target Machines 任务。

    Write-output write-verbose -verbose 只是可以输出到控制台,但它不是实时的,输出只显示一次powershell脚本完全执行。

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

    因此,作为解决方法,您可以在要运行powershell脚本的目标计算机上部署代理,然后使用运行powershell脚本的代理触发释放 实用程序:powershell 任务。


    更新:

    好吧,找另一个解决办法 实用程序: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、添加一个 实用程序:powershell 要在powershell脚本上运行的任务。(您可以登记入住或跑步 Inline Script )

    enter image description here