PATH 환경 변수 설정은 이전 명령 프롬프트에만 영향을 미친다는 것을 알았습니다. PowerShell의 환경 설정이 다른 것 같습니다. PowerShell (v1)의 환경 변수를 어떻게 변경합니까?
노트 :
변경 사항을 영구적으로 유지하고 싶기 때문에 PowerShell을 실행할 때마다 변경할 필요가 없습니다. PowerShell에 프로필 파일이 있습니까? 유닉스의 Bash 프로파일과 같은 것이 있습니까?
답변
env: namespace / drive
정보 를 사용하여 실제 환경 변수를 변경할 수 있습니다 . 예를 들어이 코드는 경로 환경 변수를 업데이트합니다.
$env:Path = "SomeRandomPath"; (replaces existing path)
$env:Path += ";SomeRandomPath" (appends to existing path)
환경 설정을 영구적으로 설정하는 방법이 있지만 PowerShell에서만 환경 설정을 사용하는 경우 프로파일을 사용하여 설정을 시작하는 것이 훨씬 좋습니다. 시작할 때 PowerShell은 내 문서 폴더 아래
의 디렉터리에서 찾은 .ps1 파일 을 실행 WindowsPowerShell
합니다. 일반적으로 profile.ps1
파일이 이미 있습니다. 내 컴퓨터의 경로는
C:\Users\JaredPar\Documents\WindowsPowerShell\profile.ps1
답변
PowerShell 세션 중에 잠시 PATH 환경 변수를 임시로 추가해야하는 경우 다음과 같이 할 수 있습니다.
$env:Path += ";C:\Program Files\GnuWin32\bin"
답변
다음을 사용하여 사용자 / 시스템 환경 변수를 영구적으로 수정할 수 있습니다 (즉, 셸을 다시 시작해도 지속됨).
시스템 환경 변수 수정
[Environment]::SetEnvironmentVariable
("Path", $env:Path, [System.EnvironmentVariableTarget]::Machine)
사용자 환경 변수 수정
[Environment]::SetEnvironmentVariable
("INCLUDE", $env:INCLUDE, [System.EnvironmentVariableTarget]::User)
주석의 사용법-시스템 환경 변수에 추가
[Environment]::SetEnvironmentVariable(
"Path",
[Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + ";C:\bin",
[EnvironmentVariableTarget]::Machine)
유형을 작성하지 않으려는 경우 문자열 기반 솔루션도 가능합니다
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", "Machine")
답변
PowerShell 프롬프트에서 :
setx PATH "$env:path;\the\directory\to\add" -m
그런 다음 텍스트를 볼 수 있습니다 :
SUCCESS: Specified value was saved.
세션을 다시 시작하면 변수를 사용할 수 있습니다. setx
또한 임의의 변수를 설정하는 데 사용될 수 있습니다. setx /?
문서화 프롬프트에서 입력 하십시오.
이런 식으로 경로를 엉망으로 만들기 전에 $env:path >> a.out
PowerShell 프롬프트에서 기존 경로의 사본을 저장하십시오 .
답변
JeanT의 답변 과 마찬가지로 경로에 추가하는 것에 대한 추상화가 필요했습니다. JeanT의 답변과 달리 사용자 상호 작용없이 실행해야했습니다. 내가 찾은 다른 행동 :
$env:Path
변경 사항이 현재 세션에 적용되도록 업데이트- 향후 세션을위한 환경 변수 변경 지속
- 동일한 경로가 이미 존재하는 경우 중복 경로를 추가하지 않습니다
유용한 경우 다음과 같습니다.
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 ';'
}
}
해당 기능에 대한 내 요지 를 확인하십시오 Remove-EnvPath
.
답변
현재 허용되는 대답은 경로 변수가 PowerShell 컨텍스트에서 영구적으로 업데이트된다는 의미에서 작동하지만 실제로 Windows 레지스트리에 저장된 환경 변수는 업데이트하지 않습니다.
이를 달성하기 위해 분명히 PowerShell을 사용할 수 있습니다.
$oldPath=(Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).Path
$newPath=$oldPath+’;C:\NewFolderToAddToTheList\’
Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH –Value $newPath
자세한 내용은 블로그 게시물에 있습니다. PowerShell을 사용하여 환경 경로 수정
PowerShell 커뮤니티 확장을 사용하는 경우 환경 변수 경로에 경로를 추가하는 올바른 명령은 다음과 같습니다.
Add-PathVariable "C:\NewFolderToAddToTheList" -Target Machine
답변
영구적 인 변경을 제안하는 모든 답변에는 동일한 문제가 있습니다.
SetEnvironmentVariable
권선 REG_EXPAND_SZ
값 %SystemRoot%\system32
(A) 내로 REG_SZ
의 값 C:\Windows\system32
.
경로의 다른 모든 변수도 손실됩니다. 를 사용하여 새 항목을 추가하면 %myNewPath%
더 이상 작동하지 않습니다.
Set-PathVariable.ps1
이 문제를 해결하기 위해 사용 하는 스크립트 는 다음과 같습니다 .
[CmdletBinding(SupportsShouldProcess=$true)]
param(
[parameter(Mandatory=$true)]
[string]$NewLocation)
Begin
{
#requires –runasadministrator
$regPath = "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
$hklm = [Microsoft.Win32.Registry]::LocalMachine
Function GetOldPath()
{
$regKey = $hklm.OpenSubKey($regPath, $FALSE)
$envpath = $regKey.GetValue("Path", "", [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)
return $envPath
}
}
Process
{
# Win32API error codes
$ERROR_SUCCESS = 0
$ERROR_DUP_NAME = 34
$ERROR_INVALID_DATA = 13
$NewLocation = $NewLocation.Trim();
If ($NewLocation -eq "" -or $NewLocation -eq $null)
{
Exit $ERROR_INVALID_DATA
}
[string]$oldPath = GetOldPath
Write-Verbose "Old Path: $oldPath"
# Check whether the new location is already in the path
$parts = $oldPath.split(";")
If ($parts -contains $NewLocation)
{
Write-Warning "The new location is already in the path"
Exit $ERROR_DUP_NAME
}
# Build the new path, make sure we don't have double semicolons
$newPath = $oldPath + ";" + $NewLocation
$newPath = $newPath -replace ";;",""
if ($pscmdlet.ShouldProcess("%Path%", "Add $NewLocation")){
# Add to the current session
$env:path += ";$NewLocation"
# Save into registry
$regKey = $hklm.OpenSubKey($regPath, $True)
$regKey.SetValue("Path", $newPath, [Microsoft.Win32.RegistryValueKind]::ExpandString)
Write-Output "The operation completed successfully."
}
Exit $ERROR_SUCCESS
}
블로그 게시물 에서 문제를 더 자세히 설명합니다 .