我有一个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)"
当脚本1运行时,我看到:
Set environment variable to ()
[All of the environment variable BUT, I DO NOT SEE ONE NAMED "DepartmentId"]
Department Id (1)
注意:1)$env:DepartmentId
值不在“Set environment variable”语句中打印,2)DepartmentId
值未列在环境变量列表中。我的意图是在第二个脚本中使用DepartmentId
,如下所示:
脚本2:
Write-Host "Using Department: $(env:DepartmentId)"
这时,脚本只显示:
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.
我已经看过其他相关的SO问题并审阅了文档。但是,这根本不起作用。我不明白我做错了什么。有人可以告诉我如何解决这个问题并解释我做错了什么?谢谢!
脚本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)"
脚本2
您仍然必须通过表达式中的$
引用变量。你在$
之前缺少env
。
Write-Host "Using Department: $($env:DepartmentId)"
要设置环境变量,您需要使用它来设置它
$env:departmentId = $myXml.Department.Id
在字符串中使用变量时,您仍然需要变量前面的$符号。如在
Write-Host "Using Department: $($env:DepartmentId)"
环境变量看起来与get-childItem不同的原因是你实际列出了一个psprovider,而不是访问变量。
Get-ChildItem Env: