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

dax*_*axu 3 powershell azure-powershell azure-devops

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

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

Write-Host "start";
Write-Host $NugetVersion;
Write-Host $($NugetVersion);
Write-Host "finish";
Run Code Online (Sandbox Code Playgroud)

Wai*_*ole 5

如果您使用以下命令设置变量,则用于设置变量的语法是正确的:

Write-Host "##vso[task.setvariable variable=NugetVersion]hello-alpha"
Run Code Online (Sandbox Code Playgroud)

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

我想重点关注您的声明,即您无法访问刚刚在同一任务中设置的变量。这是很多人陷入困境的地方task.setvariable

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

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

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

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

$NVersion = "hello-alpha"
Write-Host "##vso[task.setvariable variable=NugetVersion]$NVersion"
Run Code Online (Sandbox Code Playgroud)

将允许您访问该值并将其传递给其他任务和工作。

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

截屏

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