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

Powershell 如何在经典的devop(不是yaml)中设置变量并在不同任务之间传递?,powershell,azure-devops,azure-powershell,Powershell,Azure Devops,Azure Powershell,在我的devop经典管道中的powershell任务(不是yaml)中,我试图将值设置为一个变量,并稍后传递给不同的任务。然而,即使是在同一个任务中,我似乎没有设置正确。当我输出它时,它只是空的。 我做错了什么 ##vso[task.setvariable variable=NugetVersion]hello-alpha Write-Host "start"; Write-Host $NugetVersion; Write-Host $($NugetVersion); W

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

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

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

设置的变量代码很好,但需要使用
Write Host
进行包装

写主机“##vso[task.setvariable=NugetVersion]hello alpha”

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

写入主机$(NugetVersion)


请参阅

您设置的变量代码很好,但需要使用
写入主机
进行包装

写主机“##vso[task.setvariable=NugetVersion]hello alpha”

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

写入主机$(NugetVersion)


请参阅

设置变量时使用的语法是正确的,前提是您使用以下选项进行设置:

Write-Host "##vso[task.setvariable variable=NugetVersion]hello-alpha"
(我之所以提到这一点,是因为您的代码片段显示了
task.setvariable
,但不清楚您是否将其写入了任务输出)

我想重点关注您的陈述,即您不能访问在同一任务中刚刚设置的变量。这就是很多人被
task.setvariable
抓住的地方

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

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

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

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

$NVersion = "hello-alpha"
Write-Host "##vso[task.setvariable variable=NugetVersion]$NVersion"
将允许您访问该值并将其传递给其他任务和作业

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


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

设置变量所用的语法是正确的,前提是您设置了:

Write-Host "##vso[task.setvariable variable=NugetVersion]hello-alpha"
(我之所以提到这一点,是因为您的代码片段显示了
task.setvariable
,但不清楚您是否将其写入了任务输出)

我想重点关注您的陈述,即您不能访问在同一任务中刚刚设置的变量。这就是很多人被
task.setvariable
抓住的地方

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

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

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

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

$NVersion = "hello-alpha"
Write-Host "##vso[task.setvariable variable=NugetVersion]$NVersion"
将允许您访问该值并将其传递给其他任务和作业

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


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

最后两个示例是针对YAML管道的,在经典管道中不起作用。奇怪的是,Write host$(NugetVersion)仍然只输出null。可能##vso[task.setvariable=NugetVersion]喂,阿尔法在经典中不起作用?哦,对了。我忽略了标题包含“…(不是yaml)”。更新了答案。
##vso[task.setvariable=NugetVersion]hello alpha
应该可以在classic中工作最后两个示例适用于YAML管道,在classic管道中无法工作。奇怪的是,Write Host$(NugetVersion)仍然只是输出null。可能##vso[task.setvariable=NugetVersion]喂,阿尔法在经典中不起作用?哦,对了。我忽略了标题包含“…(不是yaml)”。更新了答案。
##vso[task.setvariable=NugetVersion]hello alpha
应该在经典模式下工作