[windows] Windows PowerShell 환경 변수 설정

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.outPowerShell 프롬프트에서 기존 경로의 사본을 저장하십시오 .


답변

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
 }

블로그 게시물 에서 문제를 더 자세히 설명합니다 .