web-dev-qa-db-fra.com

Azure DevOps - Définition et utilisation de variables dans les scripts PowerShell

J'ai un pipeline de génération Azure DevOps qui a deux scripts PowerShell distincts. Dans le premier script, j'obtiens une valeur à partir d'un fichier XML et la définit dans une variable d'environnement. Dans mon deuxième script, je veux utiliser la valeur dans la variable d'environnement. Malheureusement, je ne vois pas la variable d'environnement définie. En ce moment, j'ai:

Script 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)"

Lorsque le script 1 s'exécute, je vois:

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

Remarque: 1) La valeur $env:DepartmentId Ne s'imprime pas dans l'instruction "Définir la variable d'environnement" et 2) La valeur DepartmentId n'est PAS répertoriée dans la liste des variables d'environnement. Mon intention est d'utiliser DepartmentId dans le deuxième script, qui ressemble à ceci:

Script 2:

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

À ce moment, le script montre simplement:

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.

J'ai vu les autres questions SO et j'ai examiné les documents. Cependant, cela ne fonctionne tout simplement pas. Je ne comprends pas ce que je fais mal. Quelqu'un peut-il me montrer comment pour résoudre ce problème et expliquer ce que je fais mal? Merci!

15
Some User

Script 1

Utilisez des guillemets lorsque vous définissez la variable d'environnement via task.setvariable puisque # signifie un commentaire PowerShell. Vous avez mis en commentaire la chaîne que vous souhaitez afficher.

Notez également que la variable d'environnement peut ne pas être disponible dans le script dans lequel vous la définissez, car le pipeline doit d'abord traiter task.setvariable dans la sortie.

$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)"

Script 2

Vous devez toujours référencer les variables via $ à l'intérieur d'une expression. Tu manques $ avant env.

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

Pour définir des variables d'environnement, vous devez le définir à l'aide de

$env:departmentId = $myXml.Department.Id

Lorsque vous utilisez des variables dans des chaînes, vous avez toujours besoin du signe $ devant les variables. Un péché

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

La raison pour laquelle les variables d'environnement sont différentes pour get-childItem est que vous répertoriez en fait un psprovider, pas l'accès à la variable.

Get-ChildItem Env:

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

0
Jordan