Comment mettre à jour la variable d'environnement utilisateur PATH à partir de la ligne de commande

12

J'ai une variable PATH système avec la configuration de niveau système. J'utilise la variable PATH utilisateur pour compléter le PATH avec une configuration spécifique à l'utilisateur.

Je voudrais mettre à jour la variable PATH utilisateur depuis la ligne de commande par exemple avec setx.

Mais je ne sais pas comment référencer le chemin utilisateur existant dans setx.

Dans la commande suivante (setx sans / M)

setx PATH c:\my-user-specifc-bin-path;%PATH%

le premier CHEMIN signifie le CHEMIN de l'utilisateur mais le second% PATH% sera remplacé par le CHEMIN "complet" (utilisateur + système).

Cela signifie donc que tout le chemin du système serait dupliqué dans le CHEMIN de l'utilisateur ... ce qui n'est définitivement pas ce que je veux.

J'aimerais:

  • N'affecte que la variable d'environnement PATH utilisateur
  • Ajouter / ajouter un ou plusieurs éléments de chemin à la valeur existante
  • Faites-le à partir de la ligne de commande.
Christian Lemer
la source
Il me semble que lorsque vous utilisez, ;%PATH%vous demandez que le chemin existant (dérivé du chemin système) soit ajouté.
Daniel R Hicks

Réponses:

3

Version PowerShell, définissez PATH pour l'utilisateur:

  1. Définissez un nouveau CHEMIN (écraser) pour l'utilisateur actuel:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "C:\MyPath1"
  1. Définissez ajouter au chemin utilisateur actuel:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "$((Get-ItemProperty -path HKCU:\Environment\ -Name Path).Path);C:\MyPath1"
  1. Définissez le préfixe sur le chemin utilisateur actuel:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "C:\MyPath1;$((Get-ItemProperty -path HKCU:\Environment\ -Name Path).Path)"
Tho Ho
la source
12

Pour définir le PATH utilisateur écrasant toute valeur précédente:

setx PATH "C:\MyPath1"

Pour ajouter une valeur "C: \ MyPath0" au chemin utilisateur existant:

for /f "skip=2 tokens=3*" %a in ('reg query HKCU\Environment /v PATH') do @if [%b]==[] ( @setx PATH "C:\MyPath0;%~a" ) else ( @setx PATH "C:\MyPath0;%~a %~b" )

Pour ajouter une valeur "C: \ MyPath2" au chemin utilisateur existant:

for /f "skip=2 tokens=3*" %a in ('reg query HKCU\Environment /v PATH') do @if [%b]==[] ( @setx PATH "%~a;C:\MyPath2" ) else ( @setx PATH "%~a %~b;C:\MyPath2" )

La condition if-else est requise car le CHEMIN utilisateur peut contenir ou non des espaces. Si vous le souhaitez, vous pouvez enregistrer les commandes sous forme de fichiers batch génériques (assurez-vous de doubler chaque signe%) qui acceptent la valeur à définir / ajouter / ajouter comme argument.

Fichier batch

:: PATH-ADD - add a path to user path environment variable

@echo off
setlocal

:: set user path
set ok=0
for /f "skip=2 tokens=3*" %%a in ('reg query HKCU\Environment /v PATH') do if [%%b]==[] ( setx PATH "%%~a;%1" && set ok=1 ) else ( setx PATH "%%~a %%~b;%1" && set ok=1 )
if "%ok%" == "0" setx PATH "%1"

:end
endlocal
echo.
Karan
la source
1
plus d'explications nécessaires. qu'est-ce que% a, qu'est-ce que% b?
OfusJK
Malheureusement, cela ne fonctionne pas si l'utilisateur PATH n'est pas déjà défini :(
nowox
@KJK: for /?vous dira tout ce que vous devez savoir. :) Je ne voulais pas tout reproduire ici inutilement et je pensais que les informations seraient faciles à comprendre de toute façon.
Karan
Le code ne vérifie pas si l' utilisateur PATH se termine déjà par un point-virgule, auquel cas l'ajout du répertoire passé doit être effectué sans point-virgule supplémentaire. Mais le plus gros problème avec ce code est une corruption de l' utilisateur PATH si la chaîne dépasse 1 024 caractères en raison de la setx tronquer à 1 024 caractères avec l'affichage des informations appropriées avant de l'ajouter au registre Windows. Il peut donc arriver qu'au lieu d'ajouter un répertoire passé, l' utilisateur existant PATHsoit tronqué (tronqué) par ce code.
Mofi
4

besoin SETX /M, valeur par défaut SETXdéfinie surHKEY_CURRENT_USER

SETX /M PATH c:\my-bin-path;%PATH%
STTR
la source
Cela affecte la variable PATH du système ... peut-être que mon exemple était un détournement, mais j'aimerais bien mettre à jour la variable PATH utilisateur spécifiquement.
Christian Lemer
@Chris op111.net/82
STTR
1

Cela semble fonctionner:

setx PATH "c:\my-user-specifc-bin-path-which-may-contain-spaces;"%%PATH%%
rsphillips
la source
Il est absolument interdit de mettre à jour l' utilisateur ou le système en PATH utilisant local PATH . Cette ligne de commande corrompt vraiment l' utilisateur PATH en ajoutant au registre Windows pour l' utilisateur PATH la chaîne c:\my-user-specifc-bin-path-which-may-contain-spaces;%C:\Windows\System32;C:\Windows;C:\Windows\System32\wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;%dans le meilleur des cas. Toute personne utilisant cette ligne de commande a réussi à corrompre le paramètre utilisateur PATH et donc local PATH tel qu'utilisé par tous les processus exécutés avec le compte utilisateur actuel après le redémarrage de Windows ou la déconnexion / la connexion.
Mofi