如何在经典devop(不是yaml)中设置变量并在不同任务之间传递?

how to set variable and pass between different task in classic devop (not yaml)?

在经典管道(不是 yaml)中我的 devop 的 powershell 任务中,我试图将值设置为一个变量并稍后传递给不同的任务。但是,即使在同一个任务中,我似乎也没有正确设置它。当我输出它时,它只是空的。 我做错了什么?

##vso[task.setvariable variable=NugetVersion]hello-alpha

Write-Host "start";
Write-Host $NugetVersion;
Write-Host $($NugetVersion);
Write-Host "finish";

您的设置变量代码没问题,但需要用 Write-Host.

包裹

Write-Host "##vso[task.setvariable variable=NugetVersion]hello-alpha")

并且打印时的语法似乎不正确。应该是:

Write-Host $(NugetVersion)

参考Runtime expression syntax

你用来设置变量的语法是正确的,前提是你设置它:

Write-Host "##vso[task.setvariable variable=NugetVersion]hello-alpha"

(我提到这一点是因为您的代码片段显示了 task.setvariable,但不清楚您是否将其写入任务输出)。

我想重点关注你的说法,即你无法访问你刚刚在同一任务中设置的变量。这是很多人陷入 task.setvariable.

的地方

task.setvariable 的目的是将变量传达给其他任务、作业和阶段。它的工作方式是管道 运行 是您的 Powershell 或 Bash 脚本,然后您在该脚本中写入要设置的值。管道通过查看控制台输出并解析变量名称和值来获取您要求设置的变量。

这必须在您的任务完成后发生,因为管道无法动态获取更改并将其作为环境变量注入到 运行ning 脚本中。

因此,在脚本 运行 中选择了该变量设置后,它现在有了一个可以传递给其他任务和作业的值。

TL;DR - 在任务中,您需要将输入 task.setvariable 的值放入脚本变量中。例如,

$NVersion = "hello-alpha"
Write-Host "##vso[task.setvariable variable=NugetVersion]$NVersion"

会让您访问该值并将其传递给其他任务和作业。

编辑: 最后一件事。添加 ;isOutput=true 到您的命令是使变量可用于其他作业和阶段的原因。这是文档推荐你做的,这也是我的经验。如果您查看 Azure Pipelines 任务库项目的 LoggingCommandFunctions.ps1 库,它会显示

这不是很有帮助,因为它们都去了主机,所以我不得不对此持保留态度。