it-swarm.com.ru

DevOps Azure - установка и использование переменных в скриптах PowerShell

У меня есть конвейер сборки 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 не печатается в операторе «Задать переменную среды» и 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
Zach Templeton

Сценарий 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)"
2
Dan Wilson

Чтобы установить переменные среды, вы должны установить его с помощью

$env:departmentId = $myXml.Department.Id

При использовании переменных внутри строк вам все еще нужен знак $ перед переменными. Как в 

Write-Host "Using Department: $($env:DepartmentId)"

Причина, по которой переменные среды выглядят по-разному для get-childItem, заключается в том, что вы фактически перечисляете psprovider, а не обращаетесь к переменной.

Get-ChildItem Env:

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

0
Jordan