Establecer variables de entorno de Windows PowerShell

608

Descubrí que establecer la variable de entorno PATH afecta solo al antiguo símbolo del sistema. PowerShell parece tener diferentes configuraciones de entorno. ¿Cómo cambio las variables de entorno para PowerShell (v1)?

Nota:

Quiero hacer que mis cambios sean permanentes, por lo que no tengo que configurarlo cada vez que ejecuto PowerShell. ¿PowerShell tiene un archivo de perfil? ¿Algo así como el perfil de Bash en Unix?

Vasil
fuente
1
Me gustaría tener un perfil central ubicado en un recurso compartido de archivos. La sincronización es un dolor. Crear un perfil de código auxiliar con. \\ computer \ share \ path \ Profile.ps1 parece un error (prueba Notepad $ Profile). Sería bueno si hubiera una manera de cambiar permanentemente la variable automática $ Profile.
Nathan Hartley
55
Sin el entorno PATH no afecta comando de PowerShell rápida también. Sin embargo, lo que difiere es que powershell no acepta rutas entre comillas. Solución: elimine todas las comillas ( ") en la variable de entorno de ruta
Nilzor
3
SI ATERRIZA AQUÍ PARA PS> v1 ... Además del comentario anterior de Nilzor: Use esto para eliminar todos los "caminos de la variable de entorno PATH para su sesión:$($Env:PATH).Split(';') | %{ $str += "$($_.Trim('"'));" }; $Env:PATH=$str
d3r3kk

Respuestas:

479

El cambio de las variables de entorno reales se puede hacer utilizando la env: namespace / driveinformación. Por ejemplo, este código actualizará la variable de entorno de ruta:

$env:Path = "SomeRandomPath";             (replaces existing path) 
$env:Path += ";SomeRandomPath"            (appends to existing path)

Hay formas de hacer que la configuración del entorno sea permanente, pero si solo las usa desde PowerShell, probablemente sea mucho mejor usar su perfil para iniciar la configuración. Al inicio, PowerShell ejecutará cualquier archivo .ps1 que encuentre en el WindowsPowerShelldirectorio bajo la carpeta Mis documentos. Por lo general, ya tiene un archivo profile.ps1 allí. El camino en mi computadora es

C:\Users\JaredPar\Documents\WindowsPowerShell\profile.ps1
JaredPar
fuente
38
$ profile es una variable automática que apunta a su perfil de usuario para todos los hosts de PowerShell.
JasonMArcher 03 de
16
Tenga en cuenta que (split-path $ profile) (para obtener la carpeta que contiene) puede contener múltiples archivos de perfil: profile.ps1 debe ser cargado por todos los hosts, <host-name> _profile.ps1 solo por el host especificado. Para PowerShell.exe (host de consola), este es Microsoft.PowerShell_profile.ps1.
Richard
10
¿Qué sucede si no tengo una carpeta WindowsPowerShell en mis documentos? ¿Debo crear la carpeta y el archivo? ¿Qué debo poner en el archivo si quiero agregar C:\path\to\file.exta las variables de entorno? EDITAR: ya lo encontré. La respuesta es sí, créalo. El archivo debe consistir en 1 línea: $env:path += ;C:\path\to\file.ext".
Lewistrick
77
@Lewistrick No tiene un perfil por defecto. Seguí estas instrucciones para crear uno: howtogeek.com/50236/customizing-your-powershell-profile
MikeB
16
Tenga cuidado al hacer esto: bloqueará su camino existente. $env:Path = "SomeRandomPath"; En cambio, vea @mloskot, a continuación.
John Mark
626

Si, en algún momento durante una sesión de PowerShell, necesita agregar temporalmente a la variable de entorno PATH, puede hacerlo de esta manera:

$env:Path += ";C:\Program Files\GnuWin32\bin"
mloskot
fuente
44
+1 :: Este one-liner es bastante efectivo para las invocaciones basadas en sesión como con mingw ... IE $ env: PATH + = "; c: \ MinGW \ msys \ 1.0 \ bin" ^ {some mingw bin ... }
Eddie B
2
y como elimino un camino?
Becko
11
Si necesita que se llame su ruta antes que la estándar, insértela al principio $env:Path = "C:\MyPath;$env:Path"
Michael Freidgeim
44
**** No olvides el punto y coma al comienzo de la cadena anexa, como se ve en el comentario de @Kevin. Esto es bastante obvio, pero se puede pasar por alto si simplemente copia / pega el código en la respuesta y no tenía un punto y coma al final de la ruta existente. Intentaré enviar una edición.
Matt Goodrich
1
@MattGoodrich Regresé a la revisión anterior
Cœur
278

También puede modificar las variables de entorno del usuario / sistema de forma permanente (es decir, será persistente en los reinicios del shell) con lo siguiente:

Modificar una variable de entorno del sistema

[Environment]::SetEnvironmentVariable
     ("Path", $env:Path, [System.EnvironmentVariableTarget]::Machine)

Modificar una variable de entorno del usuario

[Environment]::SetEnvironmentVariable
     ("INCLUDE", $env:INCLUDE, [System.EnvironmentVariableTarget]::User)

Uso de comentarios: agregar a la variable de entorno del sistema

[Environment]::SetEnvironmentVariable(
    "Path",
    [Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + ";C:\bin",
    [EnvironmentVariableTarget]::Machine)

La solución basada en cadenas también es posible si no desea escribir tipos

[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", "Machine")
hoge
fuente
66
Esto es muy útil para sistemas de acceso restringido.
h0tw1r3
14
@AndresRiofrio, sí, esto es permanente. Uso: [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTartget::Machine) No verá el resultado de este cambio hasta que inicie una nueva sesión de PowerShell. Es decir, si inspecciona $ env: Path inmediatamente después de ejecutar este comando, verá qué $ env: Path era antes del comando. Para actualizar, cierre y abra el shell o inicie una nueva sesión.
FLGMwt
77
@FLGMwt tiene un error tipográfico, es correcta: [Medio Ambiente] :: SetEnvironmentVariable ( "Camino", $ env: Path + "; C: \ bin", [EnvironmentVariableTarget] :: Machine)
enthus1ast
10
Puede escribir la cadena "Máquina" o "Usuario" en lugar de toda la enumeración .NET. De Technet .
bouvierr
3
Creo que esa respuesta también debería demostrar el uso para configurar una variable de usuario, como esta[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", "User") + ";C:\bin", "User")
Saito
63

Desde el indicador de PowerShell:

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

Entonces deberías ver el texto:

SUCCESS: Specified value was saved.

Reinicie su sesión, y la variable estará disponible. setxTambién se puede utilizar para establecer variables arbitrarias. Escriba setx /?en la solicitud de documentación.

Antes de jugar con su ruta de esta manera, asegúrese de guardar una copia de su ruta actual haciendo $env:path >> a.outen un indicador de PowerShell.

tjb
fuente
55
Parece que solo funciona cuando se 'ejecuta como administrador' y, a partir de entonces, surte efecto solo para las consolas PowerShell 'ejecutándose como administrador', no para las que se ejecutan regularmente.
matanster
12
¡Ay! Acabo de ser alcanzado por el límite de 1024 caracteres de setx; Afortunadamente, seguí los consejos para registrar el valor existente de $ end: Path. Solo algo a tener en cuenta: superuser.com/questions/387619/…
Jonno
3
¿Por qué no configurar $env:PATHprimero, luego setx /m PATH "$env:PATH"para que se aplique local y globalmente sin reinicio de shell?
tresf
1
¡Agradable! Aunque setx no es un cmdlet nativo, ¡sigue siendo una alternativa mucho mejor y fácil de olvidar que esas desagradables llamadas de largo aliento .NET Framework! Es desconcertante que incluso Powershell 7 todavía no venga con un cmdlet oficial para persistir a los envvars. Qué. Se siente como una característica que debería tener paridad con 'ls'.
Jonas
27

Al igual que la respuesta de JeanT , quería una abstracción en torno a agregar al camino. A diferencia de la respuesta de JeanT, la necesitaba para funcionar sin la interacción del usuario. Otro comportamiento que estaba buscando:

  • Actualizaciones $env:Pathpara que el cambio surta efecto en la sesión actual
  • Persiste el cambio de la variable de entorno para futuras sesiones.
  • No agrega una ruta duplicada cuando ya existe la misma ruta

En caso de que sea útil, aquí está:

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

Echa un vistazo a mi esencia para la Remove-EnvPathfunción correspondiente .

Michael Kropat
fuente
16

Aunque la respuesta aceptada actual funciona en el sentido de que la variable de ruta se actualiza permanentemente desde el contexto de PowerShell, en realidad no actualiza la variable de entorno almacenada en el registro de Windows.

Para lograr eso, obviamente también puede usar 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

Más información está en la publicación del blog Use PowerShell para modificar su ruta ambiental

Si usa extensiones de comunidad de PowerShell, el comando adecuado para agregar una ruta a la ruta de la variable de entorno es:

Add-PathVariable "C:\NewFolderToAddToTheList" -Target Machine
gijswijs
fuente
12

Todas las respuestas que sugieren un cambio permanente tienen el mismo problema: rompen el valor del registro de ruta.

SetEnvironmentVariableconvierte el REG_EXPAND_SZvalor %SystemRoot%\system32 en un REG_SZvalor deC:\Windows\system32 .

Cualquier otra variable en la ruta también se pierde. Agregar nuevos usando %myNewPath%ya no funcionará.

Aquí hay un script Set-PathVariable.ps1que utilizo para solucionar este problema:

 [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
 }

Explico el problema con más detalle en una publicación de blog .

Peter Hahndorf
fuente
Si esto es: $ newPath = $ newPath -replace ";;", ";" ?
Joe Johnston el
8

Esto establece la ruta para la sesión actual y solicita al usuario que la agregue permanentemente:

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

Puede agregar esta función a su perfil predeterminado, ( Microsoft.PowerShell_profile.ps1), generalmente ubicado en %USERPROFILE%\Documents\WindowsPowerShell.

JeanT
fuente
6

Sobre la base de la respuesta de @Michael Kropat, agregué un parámetro para anteponer la nueva ruta a la PATHvariable existente y una comprobación para evitar la adición de una ruta no existente:

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 ';'
            }
        }
    }
}
SBF
fuente
5

Como Jonathan Leaders mencionó aquí , es importante ejecutar el comando / script elevado para poder cambiar las variables de entorno para 'máquina' , pero ejecutar algunos comandos elevados no tiene que hacerse con las Extensiones de comunidad, por lo que me gustaría para modificar y ampliar la respuesta de JeanT de una manera, que las variables de máquina de cambio también se pueden realizar incluso si el script en sí no se ejecuta elevado:

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
    }

}
Mehrdad Mirreza
fuente
5

La mayoría de las respuestas no se refieren a UAC . Esto cubre problemas de UAC.

Primero instale PowerShell Community Extensions: a choco install pscxtravés de http://chocolatey.org/ (puede que tenga que reiniciar su entorno de shell).

Luego habilite pscx

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

Luego usa Invoke-Elevated

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

Mi sugerencia es esta:

He probado esto para agregar C:\oracle\x64\bina la variable de entorno de forma Pathpermanente y esto funciona bien.

$ENV:PATH

La primera forma es simplemente hacer:

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

Pero este cambio no es permanente. $env:pathvolverá de forma predeterminada a lo que era antes tan pronto como cierre su terminal PowerShell y lo vuelva a abrir. Esto se debe a que ha aplicado el cambio a nivel de sesión y no a nivel de origen (que es el nivel de registro). Para ver el valor global de $env:path, haga:

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

O más específicamente:

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

Ahora para cambiar esto, primero capturamos la ruta original que necesita ser modificada:

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

Ahora definimos cómo debería ser la nueva ruta. En este caso estamos agregando una nueva carpeta:

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

Nota: asegúrese de que $newpath ve como quiere que se vea. De lo contrario, podría dañar su sistema operativo.

Ahora aplique el nuevo valor:

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

Ahora haga una comprobación final de que se ve como espera:

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

Ahora puede reiniciar su terminal PowerShell (o incluso reiniciar la máquina) y ver que no vuelva a su valor anterior.

Tenga en cuenta que el orden de las rutas puede cambiar para que esté en orden alfabético, así que asegúrese de verificar toda la línea. Para hacerlo más fácil, puede dividir la salida en filas utilizando el punto y coma como delimitador:

($env:path).split(“;”)
Ali Darabi
fuente
3

Abra PowerShell y ejecute:

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

Dentro de PowerShell, uno puede navegar al directorio de variables de entorno escribiendo:

Set-Location Env:

Esto lo llevará al directorio Env:>. Desde este directorio:

Para ver todas las variables de entorno, escriba:

Env:\> Get-ChildItem

Para ver una variable de entorno específica, escriba:

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

Para establecer una variable de entorno, escriba:

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

Para eliminar una variable de entorno, escriba:

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

Hay más información en Acerca de las variables de entorno .

Paul Maurer
fuente
0

Traté de optimizar un poco el código de SBF y Michael para hacerlo más compacto.

Confío en la coerción de tipo de PowerShell, donde convierte automáticamente las cadenas en valores de enumeración, por lo que no definí el diccionario de búsqueda.

También saqué el bloque que agrega la nueva ruta a la lista en función de una condición, de modo que el trabajo se realiza una vez y se almacena en una variable para su reutilización.

Luego se aplica de forma permanente o solo a la sesión dependiendo de la $PathContainer parámetro.

Podemos poner el bloque de código en una función o un archivo ps1 que llamamos directamente desde el símbolo del sistema. Fui con 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;

Hago algo similar para un 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;

Hasta ahora, parecen funcionar.

Eniola
fuente
0

Solo las respuestas que introducen el valor en el registro afectan un cambio permanente (por lo que la mayoría de las respuestas en este hilo, incluida la respuesta aceptada, no afectan permanentemente Path).

La siguiente función funciona tanto para Path/ PSModulePathcomo para User/ Systemtipos. También agregará la nueva ruta a la sesión actual de forma predeterminada.

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"
YorSubs
fuente