残念ながら、他の回答にはいくつかの重要な詳細が欠けています。PSModulePathには、PowerShellで特別な処理があり、環境変数を更新するときに考慮する必要があります。また、変数を追加、変更、または削除することもできます。また、パス環境変数を考慮する必要があります。
さらに悪いことに、これを行うときに使用している製品/ホストによっては、その製品には、Path環境変数(複数の値を含むもの)を期待する以外に、考慮すべき独自の特別な環境変数処理がある場合があります。 、セミコロンで区切られた)実際には名前の一部として「パス」が含まれているため、何かを見逃す可能性があります(もちろん、これがWindowsがこれらの環境変数を内部で処理する方法である場合を除きます。これは、私がそれほど深く掘り下げていなかった可能性があります。ウサギの巣穴)。
これが私が思いついたスクリプトで、現在のPowerShellセッションで再起動せずに環境変数を適切に更新できると思うのとほぼ同じです。
# Get all environment variables for the current Process, as well as System and User environment variable values
$processValues = [Environment]::GetEnvironmentVariables('Process')
$machineValues = [Environment]::GetEnvironmentVariables('Machine')
$userValues = [Environment]::GetEnvironmentVariables('User')
# Identify the entire list of environment variable names first
$envVarNames = ($machineValues.Keys + $userValues.Keys + 'PSModulePath') | Sort-Object | Select-Object -Unique
# Now process all of those keys, updating what exists and adding what is new
foreach ($envVarName in $envVarNames) {
if ($envVarName -eq 'PSModulePath') {
$pieces = @()
if ($PSVersionTable.PSVersion -ge [System.Version]'4.0') {
$pieces += Join-Path -Path ${env:ProgramFiles} -ChildPath 'WindowsPowerShell\Modules'
}
if (-not $userValues.ContainsKey($envVarName)) {
$pieces += Join-Path -Path ([Environment]::GetFolderPath('Documents')) -ChildPath 'WindowsPowerShell\Modules'
} else {
$pieces += $userValues[$envVarName] -split ';'
}
if ($machineValues.ContainsKey($envVarName)) {
$pieces += $machineValues[$envVarName] -split ';'
}
[Environment]::SetEnvironmentVariable($envVarName,($pieces -join ';'),'Process')
} elseif ($envVarName -match 'path') {
$pieces = @()
if ($userValues.ContainsKey($envVarName)) {
$pieces += $userValues[$envVarName] -split ';'
}
if ($machineValues.ContainsKey($envVarName)) {
$pieces += $machineValues[$envVarName] -split ';'
}
[Environment]::SetEnvironmentVariable($envVarName,($pieces -join ';'),'Process')
} elseif ($userValues.ContainsKey($envVarName)) {
[Environment]::SetEnvironmentVariable($envVarName,$userValue[$envVarName],'Process')
} elseif ($machineValues.ContainsKey($envVarName)) {
[Environment]::SetEnvironmentVariable($envVarName,$machineValue[$envVarName],'Process')
}
}
# Lastly remove the environment variables that no longer exist
foreach ($envVarName in $processValues.Keys | Where-Object {$envVarNames -notcontains $_}) {
Remove-Item -LiteralPath "env:${envVarName}"
}
これはほとんどテストされていないことに注意してください。ただし、原則は健全であり、この分野で過去に行った作業に基づいています。