Azure DevOps-在PowerShell脚本中设置和使用变量

Som*_*ser 9 powershell azure-devops azure-pipelines

我有一个Azure DevOps构建管道,该管道具有两个单独的PowerShell脚本。在第一个脚本中,我从XML文件中获取一个值,并将其设置在环境变量中。在第二个脚本中,我想使用环境变量中的值。不幸的是,我没有看到环境变量被设置。目前,我有:

脚本1:

$myXml = [xml](Get-Content ./MyXml.xml)  
$departmentId = $myXml.Department.Id

Write-Host ##vso[task.setvariable variable=DepartmentId;]$departmentId    
Write-Host "Set environment variable to ($env:DepartmentId)"

Get-ChildItem Env:

Write-Host "Department Id ($departmentId)"
Run Code Online (Sandbox Code Playgroud)

运行脚本1时,我看到:

Set environment variable to ()
[All of the environment variable BUT, I DO NOT SEE ONE NAMED "DepartmentId"]
Department Id (1)
Run Code Online (Sandbox Code Playgroud)

注意:1)该$env:DepartmentId值未在“设置环境变量”语句中打印,并且2)该DepartmentId值未在环境变量列表中列出。我的意图是DepartmentId在第二个脚本中使用它,如下所示:

脚本2:

Write-Host "Using Department: $(env:DepartmentId)"
Run Code Online (Sandbox Code Playgroud)

此时,脚本仅显示:

env:DepartmentId : The term 'env:DepartmentId' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
Run Code Online (Sandbox Code Playgroud)

我看过其他相关的SO问题,并查看了文档。但是,这根本行不通。我不明白我在做什么错。有人可以告诉我如何解决此问题并解释我做错了什么吗?谢谢!

Dan*_*son 14

脚本1

通过设置环境变量时使用引号,task.setvariable因为它#表示PowerShell注释。您已注释掉要输出的字符串。

另请注意,环境变量在设置脚本的位置的脚本中可能不可用,因为管道必须首先task.setvariable在输出中处理。

$myXml = [xml](Get-Content ./MyXml.xml)  
$departmentId = $myXml.Department.Id

Write-Host "##vso[task.setvariable variable=DepartmentId;]$departmentId"
Write-Host "Set environment variable to ($env:DepartmentId)"

Get-ChildItem Env:

Write-Host "Department Id ($departmentId)"
Run Code Online (Sandbox Code Playgroud)

剧本2

您仍然必须通过$表达式内部引用变量。你$以前不见了env

Write-Host "Using Department: $($env:DepartmentId)"
Run Code Online (Sandbox Code Playgroud)


Jor*_*dan 9

要设置环境变量,您需要使用

$env:departmentId = $myXml.Department.Id
Run Code Online (Sandbox Code Playgroud)

在字符串中使用变量时,变量前面仍然需要 $ 符号。如在

Write-Host "Using Department: $($env:DepartmentId)"
Run Code Online (Sandbox Code Playgroud)

get-childItem 的环境变量看起来不同的原因是您实际上列出的是 psprovider,而不是访问该变量。

Get-ChildItem Env:
Run Code Online (Sandbox Code Playgroud)

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-6

  • 这已经很接近了。然而,我归功于另一篇文章,因为这个答案中的方法不适用于问题中定义的*跨*任务。不过还是谢谢你的分享! (5认同)