PowerShell 任务不会使用 VSTS 任务组变量,但会使用 - 为什么?

标签 powershell azure-devops

我们正在使用 Slack 通知我们的开发团队有关生产代码发布的信息。我们发现这样做最灵活的方法是通过 POST 到我们的 Slack 应用程序。在请求正文中,我传递了 4 个值,如下所示,这些值被设置为任务组的参数。

在任务组中,我设置了 3 个具有默认值的参数,它们是: 名称值

  • 应用程序名称 $(Release.DefinitionName)
  • 环境 $(环境)
  • 团队 $(System.TeamProject)

Task Group Setup

我设置了一个 PowerShell 脚本任务以内联运行。它没有传递参数的选项。现在我只是将值写入控制台以查看发生了什么。

  • 写输出“env $env:environment”
  • 写输出“releaseurl $env:releaseurl”
  • 写输出“team $env:team”
  • Write-Output "application $env:applicationname"

PowerShell Task

在我的 Bash 脚本中,我使用 echo 做同样的事情,它看起来像这样:

  • echo env $(环境)
  • echo releaseurl $(Release.ReleaseWebURL)
  • 呼应团队 $(team)
  • 回显应用程序 $(applicationname)

Bash Task

当我运行这些脚本时,PowerShell 只会打印一个环境值(在发布工作流中定义)。它甚至无法使用默认的发布变量。

  • 2019-04-11T13:23:58.6833137Z 环境生产
  • 2019-04-11T13:23:58.6987109Z 发布网址
  • 2019-04-11T13:23:58.6997009Z 团队
  • 2019-04-11T13:23:58.6999878Z 申请

然而,Bash 的表现符合预期。

  • 2019-04-11T13:24:17.3299022Z 环境生产
  • 2019-04-11T13:24:17.3404876Z 团队应用服务
  • 2019-04-11T13:24:17.3405018Z 申请发布通知试点
  • 2019-04-11T13:24:17.3838219Z 发布网址 https://thereleaseurl

Bash 使用系统/发布变量没有问题。 PowerShell 将仅使用它在 VSTS 发布变量中明确定义的任何变量。我希望它使用任务组参数的值,这将允许团队使用默认值或自定义值。

因此,PowerShell 脚本将使用默认为 $(Release.DefinitionName) 的 applicationname 变量。在发布工作流程中,团队可以保持原样,或者如果定义名称不够清晰或不适合警报中报告的名称,则使用自定义值。我能让它工作的唯一方法是在发布变量中定义应用程序名称,并将其默认值设置为 $(Release.DefinitionName)。

再一次,bash 脚本工作得很好。 powershell 脚本似乎不喜欢这样。有谁知道为什么?很乐意尝试任何事情。

最佳答案

$env:variable 语法使 powershell 在运行时从环境变量中检索值。 $(variable) 语法在将脚本交给 powershell 之前执行变量的内联。

因此 $env:variable 没有被捕获为任务组的变量使用,而 $(variable) 是。

当变量包含引号或其他需要转义的特殊字符时,执行前内联可能会导致问题。

理想情况下,您会将变量作为参数传递给脚本调用,而不是作为脚本 block 中的内联值。

运行脚本 block 时,您可以在环境变量部分显式注册要提供的变量:

enter image description here

关于PowerShell 任务不会使用 VSTS 任务组变量,但会使用 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55634090/

相关文章:

powershell - Powershell:在命令行中调用Powershell时,如何传递变量以切换参数?

powershell - 将数组分配给 Powershell 中的字典条目

powershell - 如何在 PowerShell 中获取以 "ABC_"开头的 Active Directory 组名称列表?

powershell - 如何使用Powershell替换文件的一部分?

azure-devops - 如何通过 Rest API 获取 AzureDevOps 构建变量信息?

powershell - 尝试 Catch 在 Powershell 脚本中不起作用

visual-studio - 在 Visual Studio 中查看拉取请求的审阅评论

azure-devops - Azure DevOps 无法从其自己的存储库下载工件

azure - 以管理员身份运行 Azure Pipeline 中的 .exe 文件和 powershell 脚本

python - 使用 python 脚本在 azure 上创建存储时出错,获取错误消息 "TypeError: __init__() takes exactly 1 argument (2 given)"