У меня есть конвейер сборки 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 и просмотрел документы. Однако это просто не работает. Я не понимаю, что делаю не так. Может ли кто-нибудь показать мне, как это исправить, и объяснить, что я делаю не так? Спасибо!

21
Some User 14 Сен 2018 в 17:18

2 ответа

Лучший ответ

Сценарий 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)"
27
Dan Wilson 14 Сен 2018 в 15:27

Чтобы установить переменные среды, вам нужно установить их, используя

$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

1
Jordan 14 Сен 2018 в 15:24