Question Probleme de mise a jour de $env: Path

Plus d'informations
il y a 15 ans 2 mois #3727 par Tarik
Bonjour à tous,

Le code suivant me permet d'ajouter des chemins fournis par un fichier XML dans la variable d'environnement Path de Windows:
[code:1]Function Add2Path($Name, $pathFolder, $Scope)
{
Write-Host \"INFO: Adding $pathFolder in environment variable $Name in $Scope scope.\"
$CurrentPathVar = $env: path.ToString().ToLower()
If ($CurrentPathVar.Contains($pathFolder.ToLower())){
Write-Host \"INFO: $pathFolder is already in the path\"
}else{
[Environment]:: SetEnvironmentVariable($Name, $env: Path+\";$pathFolder\", $Scope)
Write-Host -ForegroundColor green \"SUCCESS: $pathFolder was added to the path\"
}
}

$IISBasePath = $ISSNode.item(0).BasePath
$IISAdminScriptsFolder = $IISBasePath.SubString(0,3) + \"AdminScripts\"
Add2Path \"Path\" \"$IISAdminScriptsFolder\" \"Machine\"

foreach($EnvironmentVariableNode in $EnvironmentVariableNodes){
Switch($EnvironmentVariableNode.Operation){
\"Append\"{
Add2Path $EnvironmentVariableNode.Name $EnvironmentVariableNode.Value $EnvironmentVariableNode.Scope
}

default{}
}
}[/code:1]

Cependant j'ai remarqué que cette variable d'environnement etait mise à jour avec la derniere valeur. Car $env: Path n'est pas modifié tant que la session powershell existe.
Quel moyen utiliser pour forcer la mise à jour de la variable sans devoir recharger la session powershell?

merci pour votre aide,
T

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 2 mois #3730 par Laurent Dardenne
Salut,
Tartar écrit:

Cependant j'ai remarqué que cette variable d'environnement etait mise à jour avec la derniere valeur. Car $env: Path n'est pas modifié tant que la session powershell existe.

Tu peux reformuler, je ne suis pas sûr t'avoir compris où est le pb :S

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 2 mois #3732 par Tarik
Oui biensure,

En fait j'ai remarqué qu'en utilisant la variable $env: Path et en lui ajoutant une nouvelle valeur, celle-ci est bien modifié dans les propriété avancé de My computer, mais lorsque l'on utilise une nouvelle fois cette variable, elle contient toujours la valeur précédent le changement et ce tant que la session powershell n'est pas recharger.

Donc dans mon cas, je veux ajouter plusieurs nouveaux chemins mais comme j'utilise $env: Path à chaque fois, je ne vois comme résultat que mon dernier chemin ajouter.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 2 mois #3734 par Laurent Dardenne
Si lors de l'appel à [Environment]::SetEnvironmentVariable le scope est Machine le process courant ne semble pas informé de la MAJ de l'environnement.
Peut être faut-il faire 2 appel un pour la machine et un autre pour le process, à moins de passer par le provider ENV pour le process local.
Tu peux consulter ce tuto sur le sujet (c'est du code Win32).

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 2 mois #3740 par Jacques Barathon
Pour info, j'avais écrit un script il y a longtemps pour ajouter un répertoire à la variable PATH:

[code:1]
# add-path.ps1
#
# Adds a directory to the PATH environment variable.
#
# Usage: add-path [-path] path [[-scope] {System | User}] [-save]
#
# - path is the full path to the directory you want to add.
#
# - scope specifies which PATH you want to modify (System or User).
# Default is User.
#
# - save indicates that the modification will be saved to the registry.
# If not specified, the modification only affects the current session,
# and further uses of add-path in the current session will override this modification.
#

param (
[string]$path = (write-error \"Usage: add-path [-path] path [[-scope] {System | User}] [-save]\"«»),
[string]$scope = \"User\",
[switch]$save
)

$AvailScopes = \"System\", \"User\"

if ($AvailScopes -notcontains $scope) {
write-error \"$scope is an unknown value for scope. Please specify one of these values: $([string]::join(', ',$AvailScopes)).\"
return
}

$wsh = new-object -com wscript.shell
$AvailScopes | % {invoke-expression ('$'+$_+'Path = $wsh.Environment(\"'+$_+'\"«»).Item(\"Path\"«»)')}
invoke-expression ('$'+$scope+'Path += \";$path\"')
$env: path = \"$SystemPath;$UserPath\"

if ($save) {
invoke-expression ('$wsh.Environment(\"'+$scope+'\"«»).Item(\"Path\"«») = $'+$scope+'Path')
}
[/code:1]
NB: sur la ligne qui commence par \"$env: path\" j'ai ajouté un espace entre \":\" et \"p\" pour éviter la conversion de la suite de caractères en smiley: :p. Il faut enlever cet espace pour exécuter correctement le script...

En le relisant je le trouve plutôt alambiqué et je le referais sans doute différemment, mais c'était surtout pour montrer l'utilisation de l'objet Shell pour accéder au PATH et le modifier de manière permanente, avec la problématique des deux contextes déjà évoquée par Laurent. Il existe sans doute d'autres moyens de faire la même modif, comme via la Registry.

La modification du PATH dans la session en cours peut se faire simplement en modification la variable standard $env: PATH.

Si on veut faire la modif à la fois dans la session en cours et de manière plus pérenne, il faut faire les deux opérations.

Janel<br><br>Message édité par: Arnaud, à: 15/01/09 21:43

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 2 mois #3744 par Arnaud Petitjean
Salut,

En d'autres termes, pour que les modifications des variables d'environnement soient persistantes, il faut les modifier dans la base de registres.

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.091 secondes
Propulsé par Kunena