윈도우즈 PowerShell 환경 변수 설정

PATH 환경변수를 설정하는 것은 이전 명령 프롬프트에만 영향을 준다는 것을 알게 되었습니다. PowerShell의 환경 설정이 다른 것 같습니다. PowerShell(v1)의 환경 변수를 변경하려면 어떻게 해야 합니까?

참고:

변경 사항을 영구적으로 만들고 싶기 때문에 PowerShell을 실행할 때마다 설정할 필요가 없습니다. PowerShell에 프로필 파일이 있습니까? 유닉스의 Bash 프로파일 같은 거요?

질문에 대한 의견 (3)

PowerShell 세션 중에 다음을 수행해야 하는 경우 PATH 환경 변수에 임시로 추가할 수 있습니다. 다음과 같이 하십시오.

$env:Path += ";C:\Program Files\GnuWin32\bin"
해설 (7)
해결책

실제 환경 변수 변경은 다음에 의해 수행될 수 있다. 'env: 네임스페이스 / 드라이브' 정보를 사용합니다. 예를 들어, 이것은 code가 경로 환경 변수를 업데이트합니다.

$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
해설 (8)

또한 다음을 사용하여 사용자/시스템 환경 변수 영구적으로(쉘 재시작 후에도 지속됨)를 수정할 수 있습니다.

시스템 환경 변수 수정

[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")
해설 (11)

&Solarisdvd PowerShell 프롬프트합니다:

setx PATH "$env:path;\the\directory\to\add" -m

그러면 텍스트를 볼 수 있습니다.

SUCCESS: Specified value was saved.

세션, 재시작하여 변수를 사용할 수 있습니다. 임의의 변수 설정 '' 세스 데 사용될 수도 있습니다. 유형 '세스 /?' 의 프롬프트합니다 설명서.

이런 방식으로 저장할 수 있는 경로를 메싱 전에 반드시 복사본인 수행여 &gt &gt, 경로, 기존 경로 '$ env: 아리우스 '의 PowerShell 프롬프트합니다.

해설 (4)

[# 39 의 JeanT& 오토메이티드] 같은 (https://stackoverflow.com/a/30694253/27581), 내가 원하는 건 추가 추상 수립하였습니다 길로. # 39 의 오토메이티드 JeanT& 달리 사용자 상호 작용 없이 실행하십시오 迈向 필요하다. 다른 비헤이비어를 찾고 있었어요.

  • 업데이트뿐 변경 적용되기 때문에 현재 세션에 길 '' $ env:
  • 향후 환경 변수를 계속 변경하십시오 세션
  • T 추가하기에서는 복제본임을 경로 같은 경로를 때 이미 Doesn& # 39.

이것은 it& # 39 의 경우에 유용하다.

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 ';'
    }
}

체크아웃하려고 [내 사진을] (https://gist.github.com/mkropat/c1226e0cc2ca941b23a9) '기능을 해당하는' 안티파스 제거하시겠습니까.

해설 (0)

비록 현재 수락됨 답을 얻을 수 있다는 점에서 작동됨 가변적입니다 있겠느 업데이트되도록 경로를 측면에서 PowerShell 얻게된다면 doesn& 업데이트하십시오 환경 변수 t # 39, 실제로 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
해설 (0)

거의 모든 답을 영구적입니다 변경률 똑같이 문제: 그들은 길을 분할합니다 레지스트리 값을.

'가치' 에 'a' '' '스텐비론망바리이블 돌리고 REG_EXPAND_SZ %SystemRoot%\system32 REG_SZ' 가치 'C:\Windows\system32'.

다른 모든 변수가 경로에 손실됩니다 잘 알려져 있다. # 39 더 이상 ',' %myNewPath% 사용하여 새로 추가 수준들과 won& 빗나갔다.

39 를 사용하고 있는 here& 스크립트입니다 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
 }

내가 이 문제에 대해 보다 자세히 블로그 포스트.

해설 (1)

현재 세션에 대한 추가 확인한 후 사용자가 영구적으로 경로를 설정합니다.

function Set-Path {
    param([string]$x)
    $Env:Path+= ";" +  $x
    Write-Output $Env:Path
    $write = Read-Host 'Set PATH permanently ? (yes|no)'
    if ($write -eq "yes")
    {
        [Environment]::SetEnvironmentVariable("Path",$env:Path, [System.EnvironmentVariableTarget]::User)
        Write-Output 'PATH updated'
    }
}

이 기능을 추가할 수 있는 기본 프로파일 ("'microsoft.powershell_profile.ps1"'), 보통 http://support. dell. "'%userprofile%\documents\windowspowershell"'.

해설 (0)

내가 바탕으로 [@Michael Kropat& # 39 의] [1] '길' 에 추가된 새로운 경로를 오토메이티드 매개변수입니다 prepend 기존 변수 및 추가 검사를 피하기 위해 존재하지 않는 경로:

function Add-EnvPath {
    param(
        [Parameter(Mandatory=$true)]
        [string] $Path,

        [ValidateSet('Machine', 'User', 'Session')]
        [string] $Container = 'Session',

        [Parameter(Mandatory=$False)]
        [Switch] $Prepend
    )

    if (Test-Path -path "$Path") {
        if ($Container -ne 'Session') {
            $containerMapping = @{
                Machine = [EnvironmentVariableTarget]::Machine
                User = [EnvironmentVariableTarget]::User
            }
            $containerType = $containerMapping[$Container]

            $persistedPaths = [Environment]::GetEnvironmentVariable('Path', $containerType) -split ';'
            if ($persistedPaths -notcontains $Path) {
                if ($Prepend) {
                    $persistedPaths = ,$Path + $persistedPaths | where { $_ }
                    [Environment]::SetEnvironmentVariable('Path', $persistedPaths -join ';', $containerType)
                }
                else {
                    $persistedPaths = $persistedPaths + $Path | where { $_ }
                    [Environment]::SetEnvironmentVariable('Path', $persistedPaths -join ';', $containerType)
                }
            }
        }

        $envPaths = $env:Path -split ';'
        if ($envPaths -notcontains $Path) {
            if ($Prepend) {
                $envPaths = ,$Path + $envPaths | where { $_ }
                $env:Path = $envPaths -join ';'
            }
            else {
                $envPaths = $envPaths + $Path | where { $_ }
                $env:Path = $envPaths -join ';'
            }
        }
    }
}

[1]: https://stackoverflow.com/a/34844707/1509300, Michael &quot Kropat&quot.

해설 (0)

이를 [조너선 지시선] (https://stackoverflow.com/users/1689770/jonathan-leaders) 언급한 [here] (https://stackoverflow.com/a/28596275) / 스크립트 명령을 실행할 수 있어 높은 환경 변수를 & # 39 를 변경할 수 있습니다, 하지만 몇 가지 명령을 실행하는 machine& # 39, # 39, 해야 할 일이 없는 높은 doesn& 도왔으매 I& 수정하고 확장할 수 있는 커뮤니티 확장명은; d # 39 와 같은 [JeanT& # 39 의] (https://stackoverflow.com/users/1116269/jeant) [답변] (https://stackoverflow.com/a/30694253) 에 시스템 자체를 바꾸는 방법을 활용할 수 있다 하더라도, t # 39 실행하십시오 com/go/4e6b330a_kr 수행됨 스크립트입니다 isn& 되었다.

function Set-Path ([string]$newPath, [bool]$permanent=$false, [bool]$forMachine=$false )
{
    $Env:Path += ";$newPath"

    $scope = if ($forMachine) { 'Machine' } else { 'User' }

    if ($permanent)
    {
        $command = "[Environment]::SetEnvironmentVariable('PATH', $env:Path, $scope)"
        Start-Process -FilePath powershell.exe -ArgumentList "-noprofile -command $Command" -Verb runas
    }

}
해설 (0)

대부분의 답변 aren& # 39, t 주소지정에 UAC. 이 닫히지만 UAC 문제.

처음 설치할 PowerShell 커뮤니티 확장장치: 초코 설치처 ps크스 ' (http://chocolatey.org/) 를 통해 (셸 환경을 다시 시작해야 할 수 있습니다).

그럼 ps크스 활성화하십시오

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser #allows scripts to run from the interwebs, such as pcsx

'다음' 높은 호출하십시오

Invoke-Elevated {Add-PathVariable $args[0] -Target Machine} -ArgumentList $MY_NEW_DIR
해설 (0)

오픈 PowerShell 실행하십시오:

[Environment]::SetEnvironmentVariable("PATH", "$ENV:PATH;<path to exe>", "USER")
해설 (0)

내 제안에 로만스였나 하나.

나는 이 환경 변수를 추가할 수 있으며, 이 '길' '' C:\oracle\x64\bin 테스트되었습니다 있겠느 작동합니다.

$ENV:PATH

첫 번째 방법은 간단히 해야 할 것:

$ENV:PATH=”$ENV:PATH;c:\path\to\folder”

하지만 이 변경 안 영구적입니다. env: $ 는 기본적으로 '길' 로 다시 다시 다시 문을 닫기 전에 빨리 powershell 터미널, 무슨 말을 했는지. 그건 아닌데 변경하십시오 선수단 적용한 때문에 세션 수준 및 소스 수준의 (원하는거요 레지스트리로 수준). '길' 의 글로벌 가치 표시하십시오 확신하느뇨: $ env:

Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH

또는 좀더 구체적으로 살펴보면 다음과 같습니다.

(Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).path

이제 이 먼저 포착하십시오 원래 경로를 바꿀 수 있는 수정해야 합니다.

$oldpath = (Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).path

지금 우리는 어떤 새로운 경로는 정의하십시오 것 같습니다. 이 경우 우리는 덧붙이는 새 폴더:

$newpath = “$oldpath;c:\path\to\folder”

참고: '외모' $ 뉴파스 원하는 방식으로 볼 수 있어야 합니다. 그렇지 않을 경우 해당 OS 손상을 줄 수 있습니다.

이제 새로운 가치를 적용하십시오.

Set-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH -Value $newPath

이제 최종 확인 할 수 있는 방법을 마치 한 것으로 예상하고 있습니다.

(Get-ItemProperty -Path ‘Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment’ -Name PATH).Path

이제 재시작하여 PowerShell 터미널 (심지어 머시닝할 재부팅하십시오) 를 다시 이전 값에 싫어하겠어 롤백에서 것이 있다.

변경할 수 있도록 오더할 기록하십시오 경로가 애태우면 문자순으로 도왔으매 smartupdate 전체 할말이다 확인할 수 있습니다 보다 쉽게 분할할 수 있습니다) 를 사용하여 출력입니다 행뿐만 세미콜론이 구분 기호로:

($env:path).split(“;”)
해설 (0)

시도는 해봤는데 최적화 [SBF& # 39 의] [1] 및 [Michael& # 39 의] [2] 코드가 좀 좀 더 쉽게 컴팩트형.

39 의 유형을 실로나는 PowerShell& 의존하고 있는, 그래서 저는 이넘 값뿐만 didn& # 39 는 자동으로 급지될 강제 문자열 t 정의하십시오 사전이므로 조회

난 또 새로운 길을 추가하므로 목록에 나온 아웃해야 블록의 기반으로 한 번 저장됩니까 찼음을 도왔으매 작동합니까 완료되어도 변수가 재사용률이.

그런 가공할지 있겠느 발려짐 세션에 대한 '$ 파스콘타이너 따라' 매개변수입니다.

우리가 할 수 있는 함수 또는 ps1 의 코드 블록 동일팔레트에 명령 프롬프트에서 직접 파일을 라고 부릅니다. 함께 갔던 DevEnvAddPath.ps1.

param(
    [Parameter(Position=0,Mandatory=$true)][String]$PathChange,

    [ValidateSet('Machine', 'User', 'Session')]
    [Parameter(Position=1,Mandatory=$false)][String]$PathContainer='Session',
    [Parameter(Position=2,Mandatory=$false)][Boolean]$PathPrepend=$false
)

[String]$ConstructedEnvPath = switch ($PathContainer) { "Session"{${env:Path};} default{[Environment]::GetEnvironmentVariable('Path', $containerType);} };
$PathPersisted = $ConstructedEnvPath -split ';';

if ($PathPersisted -notcontains $PathChange) {
    $PathPersisted = $(switch ($PathPrepend) { $true{,$PathChange + $PathPersisted;} default{$PathPersisted + $PathChange;} }) | Where-Object { $_ };

    $ConstructedEnvPath = $PathPersisted -join ";";
}

if ($PathContainer -ne 'Session') 
{
    # Save permanently to Machine, User
    [Environment]::SetEnvironmentVariable("Path", $ConstructedEnvPath, $PathContainer);
}

# Update the current session
${env:Path} = $ConstructedEnvPath;

나는한다 비슷한 DevEnvRemovePath.ps1. 대한

param(
    [Parameter(Position=0,Mandatory=$true)][String]$PathChange,

    [ValidateSet('Machine', 'User', 'Session')]
    [Parameter(Position=1,Mandatory=$false)][String]$PathContainer='Session'
)

[String]$ConstructedEnvPath = switch ($PathContainer) { "Session"{${env:Path};} default{[Environment]::GetEnvironmentVariable('Path', $containerType);} };
$PathPersisted = $ConstructedEnvPath -split ';';

if ($PathPersisted -contains $PathChange) {
    $PathPersisted = $PathPersisted | Where-Object { $_ -ne $PathChange };

    $ConstructedEnvPath = $PathPersisted -join ";";
}

if ($PathContainer -ne 'Session') 
{
    # Save permanently to Machine, User
    [Environment]::SetEnvironmentVariable("Path", $ConstructedEnvPath, $PathContainer);
}

# Update the current session
${env:Path} = $ConstructedEnvPath;

지금까지 마치 작동합니까.

[1]: # 48624689 https://stackoverflow.com/questions/714877/setting-windows-powershell-environment-variables/48624689 [2]: # 34844707 https://stackoverflow.com/questions/714877/setting-windows-powershell-environment-variables/34844707

해설 (0)

디렉토리 내에서 한 환경 변수를 입력하여 PowerShell, 이동할 수 있습니다.

Set-Location Env:

이 너회와 다운스트림에서 Env:\&gt. 디렉터리입니다. 이 내에서 디렉터리입니다.

모두 볼 수 있는 환경 변수, 유형:

Env:\> Get-ChildItem

특정 환경 변수 mm_mail_doc. 볼 수 있습니다.

Env:\> $Env:, e.g. $Env:Path

환경 변수 설정, 유형:

Env:\> $Env: = "", e.g. $Env:Path="C:\Users\"

환경 변수를 지루려면 mm_mail_doc.:

Env:\> remove-item Env:, e.g. remove-item Env:SECRET_KEY

자세한 정보는 in [환경 변수에 대한] [1] .

[1]: 보기 = powershell 6 https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables?

해설 (0)