Windows PowerShell 환경 변수 설정


605

PATH 환경 변수 설정은 이전 명령 프롬프트에만 영향을 미친다는 것을 알았습니다. PowerShell의 환경 설정이 다른 것 같습니다. PowerShell (v1)의 환경 변수를 어떻게 변경합니까?

노트 :

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


1
파일 공유에 중앙 프로파일을 갖고 싶습니다. 동기화는 고통입니다. 을 사용하여 스텁 프로파일 작성. \\ computer \ share \ path \ Profile.ps1은 kludge처럼 보입니다 (메모장 $ Profile 시도). $ Profile 자동 변수를 영구적으로 변경하는 방법이 있다면 좋을 것입니다.
Nathan Hartley

5
PATH 환경 powershell 명령 프롬프트에도 영향을 미치지 않습니다 . 그러나 powershell은 따옴표로 묶은 경로를 허용하지 않습니다. 해결 방법 : "경로 환경 변수에서 모든 따옴표 ( )를 제거하십시오.
Nilzor

3
PS> v1을 방문하는 경우 위의 Nilzor 의견에 더하여 : 세션의 PATH 환경 변수에있는 경로에서 모든 "를 제거하려면 다음을 사용하십시오.$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str
d3r3kk

답변:


477

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

38
$ profile은 모든 PowerShell 호스트에 대한 사용자 프로필을 가리키는 자동 변수입니다.
JasonMArcher 2009

16
(포함 폴더를 가져 오기 위해) (split-path $ profile)은 여러 개의 프로필 파일을 포함 할 수 있습니다. profile.ps1은 모든 호스트에 의해, <host-name> _profile.ps1은 지정된 호스트에 의해로드되어야합니다. PowerShell.exe (콘솔 호스트)의 경우 Microsoft.PowerShell_profile.ps1입니다.
Richard

10
문서에 WindowsPowerShell 폴더가 없으면 어떻게합니까? 폴더와 파일을 만들어야합니까? C:\path\to\file.ext환경 변수 에 추가하려면 파일에 무엇을 넣어야 합니까? 편집 : 이미 찾았습니다. 대답은 '예'입니다. 파일은 한 줄로 구성되어야합니다 $env:path += ;C:\path\to\file.ext".
Lewistrick

7
@Lewistrick 기본적으로 프로필이 없습니다. 이 지침에 따라 하나를 만들었습니다. howtogeek.com/50236/customizing-your-powershell-profile
MikeB

16
이 작업을 조심하십시오-기존 경로를 방해합니다. $env:Path = "SomeRandomPath"; 대신-아래 @mloskot을 참조하십시오.
존 마크

626

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

$env:Path += ";C:\Program Files\GnuWin32\bin"

4
+1 ::이 one-liner는 mingw와 마찬가지로 세션 기반 호출에 매우 효과적입니다. IE $ env : PATH + = "; c : \ MinGW \ msys \ 1.0 \ bin"^ {some mingw bin ... }
Eddie B

2
경로를 어떻게 제거합니까?
becko

11
표준 경로보다 먼저 경로를 $env:Path = "C:\MyPath;$env:Path"
불러야

4
**** @Kevin의 의견에서 볼 수 있듯이 추가 문자열의 시작 부분에서 세미콜론을 잊지 마십시오. 이것은 명백하지만, 답변에 코드를 복사 / 붙여 넣기 만하고 기존 경로 끝에 세미콜론이없는 경우 놓칠 수 있습니다. 수정 사항을 제출하려고합니다.
Matt Goodrich

1
@MattGoodrich 이전 개정판으로 롤백했습니다
Cœur

278

다음을 사용하여 사용자 / 시스템 환경 변수를 영구적으로 수정할 수 있습니다 (즉, 셸을 다시 시작해도 지속됨).

시스템 환경 변수 수정

[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")

6
이것은 제한된 액세스 시스템에 매우 유용합니다.
h0tw1r3

14
@AndresRiofrio, 예, 이것은 영구적입니다. 사용법 : [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTartget::Machine) 새로운 powershell 세션을 시작할 때까지이 변경 결과가 표시되지 않습니다. 즉,이 명령을 실행 한 직후 $ env : Path를 검사하면 명령 이전에 $ env : Path가 무엇인지 알 수 있습니다. 업데이트하려면 셸을 닫았다가 열거 나 새 세션을 시작하십시오.
FLGMwt

7
@FLGMwt 오타가 있습니다. [Environment] :: SetEnvironmentVariable ( "Path", $ env : Path + "; C : \ bin", [EnvironmentVariableTarget] :: Machine)
enthus1ast

10
전체 .NET 열거 형 대신 "Machine"또는 "User"라는 문자열을 쓸 수 있습니다. 에서 윈스 테크넷 .
bouvierr

3
대답은 이와 같은 사용자 변수 설정에 대한 사용법을 보여 주어야한다고 생각합니다.[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\bin", "User")
Saito

63

PowerShell 프롬프트에서 :

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

그런 다음 텍스트를 볼 수 있습니다 :

SUCCESS: Specified value was saved.

세션을 다시 시작하면 변수를 사용할 수 있습니다. setx또한 임의의 변수를 설정하는 데 사용될 수 있습니다. setx /?문서화 프롬프트에서 입력 하십시오.

이런 식으로 경로를 엉망으로 만들기 전에 $env:path >> a.outPowerShell 프롬프트에서 기존 경로의 사본을 저장하십시오 .


5
'관리자로 실행'할 때만 작동하는 것으로 보이며, 이후 정기적으로 실행되지 않는 '관리자로 실행'PowerShell 콘솔에만 적용됩니다.
matanster


12
아야-setx의 1024 자 제한에 도달했습니다. 고맙게도 나는 $ end : Path의 기존 가치를 기록하기 위해 조언을 따랐습니다. 알아
두어야 할 사항

3
셸을 다시 시작하지 않고 로컬 및 전 세계에 적용되도록 $env:PATH먼저 설정하지 않는 이유는 무엇 setx /m PATH "$env:PATH"입니까?
tresf

1
좋은! setx는 기본 cmdlet이 아니지만 오래 지속되는 .NET Framework 호출에 대한 훨씬 더 좋고 쉽게 잊혀진 대안입니다! Powershell 7조차도 여전히 envvar를 유지하기위한 공식 cmdlet이 제공되지 않는다는 것은 당황합니다. 뭐. 'ls'와 패리티가 있어야하는 기능인 것 같습니다.
요나스

27

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.


16

현재 허용되는 대답은 경로 변수가 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

12

영구적 인 변경을 제안하는 모든 답변에는 동일한 문제가 있습니다.

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
 }

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


$ newPath = $ newPath -replace ";;", ";"이어야합니다. ?
Joe Johnston

8

현재 세션의 경로를 설정하고 사용자에게 영구적으로 추가하라는 메시지를 표시합니다.

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)에 추가 할 수 있습니다 %USERPROFILE%\Documents\WindowsPowerShell.


6

@ Michael Kropat의 대답 을 바탕으로 기존 PATH변수에 새 경로를 추가하는 매개 변수를 추가하고 존재 하지 않는 경로를 추가하지 않도록 확인했습니다.

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

5

조나단 지도자가 언급 여기에 , 명령 / 스크립트에 대한 변화 환경 변수에 할 수 상승을 실행하는 것이 중요하다 '기계' ,하지만 상승 몇 가지 명령을 실행하는 내가 좋아하는 것, 그래서 커뮤니티 확장하여 수행 할 필요가 없습니다 JeanT의 답변 을 수정하고 확장하기 위해 스크립트 자체가 높은 수준으로 실행되지 않아도 기계 변수 변경을 수행 할 수도 있습니다.

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
    }

}

5

대부분의 답변은 UAC를 다루지 않습니다 . 여기에는 UAC 문제가 포함됩니다.

먼저 http://chocolatey.org/choco install pscx 를 통해 PowerShell 커뮤니티 확장을 설치 하십시오 (쉘 환경을 다시 시작해야 할 수도 있음).

그런 다음 pscx를 활성화하십시오.

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

그런 다음 사용 Invoke-Elevated

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

4

내 제안은 이것입니다.

C:\oracle\x64\bin환경 변수에 Path영구적으로 추가 하기 위해 이것을 테스트 했으며 정상적으로 작동합니다.

$ENV:PATH

첫 번째 방법은 간단하게 수행하는 것입니다.

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

그러나이 변경은 영구적이지 않습니다. $env:pathPowerShell 터미널을 닫았다가 다시 열면 바로 이전 상태로 돌아갑니다. 소스 레벨 (레지스트리 레벨)이 아닌 세션 레벨에서 변경 사항을 적용했기 때문입니다. 의 전역 값을 보려면 다음을 $env:path수행하십시오.

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

참고 : $newpath모양이 원하는 모양 인지 확인하십시오 . 그렇지 않으면 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 터미널을 다시 시작하거나 시스템을 다시 부팅하여 이전 값으로 다시 롤백되지 않는 것을 확인할 수 있습니다.

알파벳 순서대로 경로 순서가 변경 될 수 있으므로 전체 행을 확인하십시오. 보다 쉽게하기 위해 세미콜론을 구분 기호로 사용하여 출력을 행으로 분할 할 수 있습니다.

($env:path).split(“;”)

3

PowerShell을 열고 다음을 실행하십시오.

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

1

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

Set-Location Env:

그러면 Env :> 디렉토리로 이동합니다. 이 디렉토리 내에서 :

모든 환경 변수를 보려면 다음을 입력하십시오.

Env:\> Get-ChildItem

특정 환경 변수를 보려면 다음을 입력하십시오.

Env:\> $Env:<variable name>, e.g. $Env:Path

환경 변수를 설정하려면 다음을 입력하십시오.

Env:\> $Env:<variable name> = "<new-value>", e.g. $Env:Path="C:\Users\"

환경 변수를 제거하려면 다음을 입력하십시오.

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

자세한 내용은 환경 변수 정보에 있습니다.


0

SBFMichael의 코드를 조금 더 최적화 하기 위해 약간 최적화를 시도 했습니다.

PowerShell의 유형 강제에 의존하여 문자열을 열거 형 값으로 자동 변환하므로 조회 사전을 정의하지 않았습니다.

또한 조건에 따라 목록에 새 경로를 추가하는 블록을 꺼내서 작업을 한 번 수행하고 재사용을 위해 변수에 저장했습니다.

그런 다음 $PathContainer매개 변수 에 따라 영구적으로 또는 세션에만 적용됩니다 .

명령 프롬프트에서 직접 호출하는 함수 또는 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;

지금까지는 효과가있는 것 같습니다.


0

값을 레지스트리로 푸시하는 답변 만 영구 변경에 영향을 미칩니다 (따라서 수락 된 답변을 포함하여이 스레드에 대한 대부분의 답변은에 영구적으로 영향을 미치지 않습니다Path ).

다음 함수는 Path/ PSModulePathUser/ System유형 모두에 대해 작동합니다 . 또한 기본적으로 현재 세션에 새 경로를 추가합니다.

function AddTo-Path {
    param ( 
        [string]$PathToAdd,
        [Parameter(Mandatory=$true)][ValidateSet('System','User')][string]$UserType,
        [Parameter(Mandatory=$true)][ValidateSet('Path','PSModulePath')][string]$PathType
    )

    # AddTo-Path "C:\XXX" "PSModulePath" 'System' 
    if ($UserType -eq "System" ) { $RegPropertyLocation = 'HKLM:\System\CurrentControlSet\Control\Session Manager\Environment' }
    if ($UserType -eq "User"   ) { $RegPropertyLocation = 'HKCU:\Environment' } # also note: Registry::HKEY_LOCAL_MACHINE\ format
    $PathOld = (Get-ItemProperty -Path $RegPropertyLocation -Name $PathType).$PathType
    "`n$UserType $PathType Before:`n$PathOld`n"
    $PathArray = $PathOld -Split ";" -replace "\\+$", ""
    if ($PathArray -notcontains $PathToAdd) {
        "$UserType $PathType Now:"   # ; sleep -Milliseconds 100   # Might need pause to prevent text being after Path output(!)
        $PathNew = "$PathOld;$PathToAdd"
        Set-ItemProperty -Path $RegPropertyLocation -Name $PathType -Value $PathNew
        Get-ItemProperty -Path $RegPropertyLocation -Name $PathType | select -ExpandProperty $PathType
        if ($PathType -eq "Path") { $env:Path += ";$PathToAdd" }                  # Add to Path also for this current session
        if ($PathType -eq "PSModulePath") { $env:PSModulePath += ";$PathToAdd" }  # Add to PSModulePath also for this current session
        "`n$PathToAdd has been added to the $UserType $PathType"
    }
    else {
        "'$PathToAdd' is already in the $UserType $PathType. Nothing to do."
    }
}

# Add "C:\XXX" to User Path (but only if not already present)
AddTo-Path "C:\XXX" "User" "Path"

# Just show the current status by putting an empty path
AddTo-Path "" "User" "Path"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.