Question Définition de la variable de chemin Windows PowerShell


J'ai découvert que la définition de la variable d'environnement PATH n'affecte que l'ancienne invite de commande. PowerShell semble avoir des paramètres d'environnement différents. Comment modifier les variables d'environnement pour PowerShell (v1)?

Remarque:

Je veux rendre mes modifications permanentes, donc je n'ai pas à les définir chaque fois que je lance PowerShell. Est-ce que PowerShell a un fichier de profil? Quelque chose comme le profil de Bash sur Unix?


436
2018-04-03 17:19


origine


Réponses:


Changer les variables d'environnement réelles peut être fait par en utilisant le env: namespace / drive information. Par exemple, ceci le code mettra à jour la variable d'environnement path:

$env:Path = "SomeRandomPath";

Il existe des moyens de rendre les paramètres d'environnement permanents, mais si vous les utilisez uniquement à partir de PowerShell, c'est probablement beaucoup mieux d'utiliser votre profil pour initier le paramètres. Au démarrage, PowerShell exécutera tout .ps1 fichiers trouvés dans le répertoire WindowsPowerShell sous Dossier Mes documents. Typiquement, vous avez un profile.ps1 fichier déjà là. Le chemin sur mon ordinateur est

c:\Users\JaredPar\Documents\WindowsPowerShell\profile.ps1

301
2018-04-03 17:35



Si, quelque temps pendant une session PowerShell, vous devez modifier temporairement la variable d'environnement PATH, vous pouvez fais comme ça:

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

525
2017-08-26 10:22



Vous pouvez également modifier les variables d'environnement utilisateur / système de manière permanente (c'est-à-dire persistantes entre les redémarrages du shell) avec les éléments suivants:

### Modify system environment variable ###
[Environment]::SetEnvironmentVariable
     ( "Path", $env:Path, [System.EnvironmentVariableTarget]::Machine )

### Modify user environment variable ###
[Environment]::SetEnvironmentVariable
     ( "INCLUDE", $env:INCLUDE, [System.EnvironmentVariableTarget]::User )

### from comments ###
### Usage from comments - Add to the system environment variable ###
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\bin", [EnvironmentVariableTarget]::Machine)

179
2018-04-03 12:06



À partir de l'invite PowerShell:

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

Vous devriez alors voir le texte:

SUCCESS: Specified value was saved.

Redémarrez votre session et la variable sera disponible. setx peut également être utilisé pour définir des variables arbitraires. Type setx /? à l'invite pour la documentation.

Avant de vous occuper de votre chemin de cette manière, assurez-vous de sauvegarder une copie de votre chemin existant en faisant $env:path >> a.out dans une invite PowerShell.


42
2018-01-09 13:03



Bien que la réponse actuellement acceptée fonctionne dans le sens où la variable path est mise à jour en permanence à partir du contexte de PowerShell, elle ne met pas à jour la variable d'environnement stockée dans le registre Windows. Pour y parvenir, vous pouvez évidemment également utiliser 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

Plus d'infos ici: http://blogs.technet.com/b/heyscriptingguy/archive/2011/07/23/use-powershell-to-modify-your-environmental-path.aspx

Si vous utilisez des extensions de communauté PowerShell, la commande appropriée pour ajouter un chemin d'accès au chemin de la variable d'environnement est la suivante:

Add-PathVariable "C:\NewFolderToAddToTheList" -Target Machine

12
2017-12-17 11:23



Comme La réponse de JeanT, Je voulais une abstraction autour de l'ajout au chemin. Contrairement à la réponse de JeanT, je devais l'exécuter sans intervention de l'utilisateur. Autre comportement que je cherchais:

  • Mises à jour $env:Path donc le changement prend effet dans la session en cours
  • Persiste le changement de variable d'environnement pour les futures sessions
  • N'ajoute pas de chemin dupliqué lorsque le même chemin existe déjà

Au cas où c'est utile, le voici:

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

Check-out mon essence pour le correspondant Remove-EnvPath fonction.


12
2018-01-17 22:48



Cela définit le chemin de la session en cours et invite l'utilisateur à l'ajouter définitivement:

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

Vous pouvez ajouter cette fonction à votre profil par défaut, (Microsoft.PowerShell_profile.ps1), généralement situé à %USERPROFILE%\Documents\WindowsPowerShell.


7
2018-06-07 13:47



Toutes les réponses suggérant un changement permanent ont le même problème: elles cassent la valeur du registre du chemin.

SetEnvironmentVariable tourne le REG_EXPAND_SZ valeur %SystemRoot%\system32  dans une REG_SZ valeur de C:\Windows\system32.

Toutes les autres variables du chemin sont également perdues. Ajout de nouveaux en utilisant %myNewPath% ne fonctionnera plus.

Voici un script Set-PathVariable.ps1 que j'utilise pour résoudre ce problème:

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

J'explique le problème plus en détail dans un article de blog.


6
2017-10-10 13:08