Setting Windows PowerShell environment variables
Solution 1:
If, some time during a PowerShell session, you need to append to the PATH environment variable temporarily, you can do it this way:
$env:Path += ";C:\Program Files\GnuWin32\bin"
If you need your path to be called before standard one, insert it at the beginning
$env:Path = "C:\Program Files\GnuWin32\bin;$env:Path"
Solution 2:
Changing the actual environment variables can be done by
using the env: namespace / drive
information. For example, this
code will update the path environment variable:
$env:Path = "SomeRandomPath"; (replaces existing path)
$env:Path += ";SomeRandomPath" (appends to existing path)
There are ways to make environment settings permanent, but
if you are only using them from PowerShell, it's probably
a lot better to use your profile to initiate the
settings. On startup, PowerShell will run any .ps1
files it finds in the WindowsPowerShell
directory under
My Documents folder. Typically you have a profile.ps1
file already there. The path on my computer is
C:\Users\JaredPar\Documents\WindowsPowerShell\profile.ps1
Solution 3:
You can also modify user/system environment variables permanently (i.e. will be persistent across shell restarts) with the following:
Modify a system environment variable
[Environment]::SetEnvironmentVariable
("Path", $env:Path, [System.EnvironmentVariableTarget]::Machine)
Modify a user environment variable
[Environment]::SetEnvironmentVariable
("INCLUDE", $env:INCLUDE, [System.EnvironmentVariableTarget]::User)
Usage from comments - add to the system environment variable
[Environment]::SetEnvironmentVariable(
"Path",
[Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + ";C:\bin",
[EnvironmentVariableTarget]::Machine)
String based solution is also possible if you don't want to write types
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", "Machine")
Solution 4:
WARNING: save a copy of your existing path by doing $env:path >> a.out
in a PowerShell prompt, in case something goes wrong.
From the PowerShell prompt:
setx PATH "$env:path;\the\directory\to\add" -m
You should then see the text:
SUCCESS: Specified value was saved.
Restart your session, and the variable will be available. setx
can also be used to set arbitrary variables. Type setx /?
at the prompt for documentation.
Solution 5:
Like JeanT's answer, I wanted an abstraction around adding to the path. Unlike JeanT's answer I needed it to run without user interaction. Other behavior I was looking for:
- Updates
$env:Path
so the change takes effect in the current session - Persists the environment variable change for future sessions
- Doesn't add a duplicate path when the same path already exists
In case it's useful, here it is:
function Add-EnvPath {
param(
[Parameter(Mandatory=$true)]
[string] $Path,
[ValidateSet('Machine', 'User', 'Session')]
[string] $Container = 'Session'
)
if ($Container -ne 'Session') {
$containerMapping = @{
Machine = [EnvironmentVariableTarget]::Machine
User = [EnvironmentVariableTarget]::User
}
$containerType = $containerMapping[$Container]
$persistedPaths = [Environment]::GetEnvironmentVariable('Path', $containerType) -split ';'
if ($persistedPaths -notcontains $Path) {
$persistedPaths = $persistedPaths + $Path | where { $_ }
[Environment]::SetEnvironmentVariable('Path', $persistedPaths -join ';', $containerType)
}
}
$envPaths = $env:Path -split ';'
if ($envPaths -notcontains $Path) {
$envPaths = $envPaths + $Path | where { $_ }
$env:Path = $envPaths -join ';'
}
}
Check out my gist for the corresponding Remove-EnvPath
function.