Setting Windows PowerShell environment variables

前端 未结 18 2049
日久生厌
日久生厌 2020-11-22 11:03

I have found out that setting the PATH environment variable affects only the old command prompt. PowerShell seems to have different environment settings. How do I change the

18条回答
  •  面向向阳花
    2020-11-22 11:27

    Only the answers that push the value into the registry affect a permanent change (so the majority of answers on this thread, including the accepted answer, do not permanently affect the Path).

    The following function works for both Path / PSModulePath and for User / System types. It will also add the new path to the current session by default.

    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"
    

提交回复
热议问题