Si une instance de PowerShell ISE est en cours d'exécution et que j'installe quelque chose qui modifie le chemin PATH ou de quelque manière que ce soit en dehors de PowerShell, je dois redémarrer PowerShell pour qu'il puisse voir la variable PATH mise à jour.
Existe-t-il un moyen de recharger le chemin depuis PowerShell sans le redémarrer?
Juste pour amener commentaire de Rob à la lumière:
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
Essayez d’obtenir le chemin d’ordinateur et de l’affecter au chemin de la session.
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
Manière la plus simple, utilisez Chocolatey (freeware). Cela fonctionne à la fois pour CMD et PowerShell. Ensuite, vous pourrez recharger PATH (avec une extension variable) avec une simple commande:
refreshenv
Installation à partir de cmd (nécessite des droits d'administrateur):
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
Exemple d'utilisation:
> SET Java_HOME=c:/Java/jdk6
> SET PATH=%Java_HOME%/bin
> ECHO %PATH%
c:/Java/jdk6/bin
> SET Java_HOME=c:/Java/jdk8
> refreshenv
Refreshing environment variables from registry for cmd.exe. Please wait...Finished..
> echo %PATH%
c:/Java/jdk8/bin
Basé sur réponse de mpen , voici une fonction PowerShell:
function refresh-path {
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") +
";" +
[System.Environment]::GetEnvironmentVariable("Path","User")
}
Ensuite, appelez simplement refresh-path
.
Si votre chemin contient des variables d'environnement qui n'étaient pas définies au début de la session, vous devrez également les développer:
$env:Path = [System.Environment]::ExpandEnvironmentVariables([System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User"))
Pour moi, cela a été utile après avoir installé NVM, qui définit et ajoute% NVM_HOME% au chemin.
Pour mener ceci à son terme, vous pouvez utiliser cette fonction récursive pour développer à la place:
function Expand-EnvironmentVariablesRecursively($unexpanded) {
$previous = ''
$expanded = $unexpanded
while($previous -ne $expanded) {
$previous = $expanded
$expanded = [System.Environment]::ExpandEnvironmentVariables($previous)
}
return $expanded
}
Et ensuite utiliser:
$env:Path = Expand-EnvironmentVariablesRecursively([System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User"))
J'ai ouvert un problème ajouter cette solution dans refreshenv
de Chocolatey.
Juste pour ajouter à d’autres réponses, vous pouvez vous assurer que vous n’ajoutez pas de jointures superflues en filtrant au cas où l’utilisateur aurait un chemin vide.
$env:Path=(
[System.Environment]::GetEnvironmentVariable("Path","Machine"),
[System.Environment]::GetEnvironmentVariable("Path","User")
) -match '.' -join ';'
Ou, plus utilement, si vous exécutez un script qui ajoute à une ou plusieurs variables d’environnement, utilisez une fonction pour les réinitialiser.
function resetEnv {
Set-Item `
-Path (('Env:', $args[0]) -join '') `
-Value ((
[System.Environment]::GetEnvironmentVariable($args[0], "Machine"),
[System.Environment]::GetEnvironmentVariable($args[0], "User")
) -match '.' -join ';')
}
resetEnv Path
resetEnv AppPath