Come aggiornare la variabile di ambiente utente PATH dalla riga di comando


12

Ho una variabile di sistema PATH con la configurazione a livello di sistema. Uso la variabile PATH dell'utente per integrare il PATH con la configurazione specifica dell'utente.

Vorrei aggiornare la variabile PATH dell'utente dalla riga di comando, ad esempio con setx.

Ma non so come fare riferimento al percorso utente esistente in setx.

Nel seguente comando (setx senza / M)

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

il primo PERCORSO indica il PERCORSO utente ma il secondo% PERCORSO% sarà sostituito dal PERCORSO "completo" (utente + sistema).

Quindi significa che l'intero percorso del sistema sarebbe duplicato nel PERCORSO utente ... ciò che non è definitivamente ciò che voglio.

Mi piacerebbe:

  • Interessa solo la variabile d'ambiente PATH dell'utente
  • Aggiungi / Prependi uno o più elementi del percorso al valore esistente
  • Fallo dalla riga di comando.

Mi sembra che quando usi ;%PATH%stai chiedendo di aggiungere il percorso esistente (derivato dal percorso di sistema).
Daniel R Hicks,

Risposte:


3

Versione di PowerShell, impostare PATH per l'utente:

  1. Imposta nuovo PATH (sovrascrivi) per l'utente corrente:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "C:\MyPath1"
  1. Imposta append per l'utente corrente PERCORSO:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "$((Get-ItemProperty -path HKCU:\Environment\ -Name Path).Path);C:\MyPath1"
  1. Imposta anteporre all'utente corrente PERCORSO:
PS> Set-ItemProperty -path HKCU:\Environment\ -Name Path -Value "C:\MyPath1;$((Get-ItemProperty -path HKCU:\Environment\ -Name Path).Path)"

12

Per impostare il PERCORSO utente sovrascrivendo qualsiasi valore precedente:

setx PATH "C:\MyPath1"

Per anteporre un valore "C: \ MyPath0" al PERCORSO utente esistente:

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

Per aggiungere un valore "C: \ MyPath2" al PERCORSO utente esistente:

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 condizione if-else è obbligatoria perché il PERCORSO utente può contenere o meno spazi. Se lo desideri, puoi salvare i comandi come file batch generici (assicurati di raddoppiare ogni segno%) che accettano il valore da impostare / anteporre / aggiunto come argomento.

File 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.

1
sono necessarie ulteriori spiegazioni. cos'è% a, cos'è% b?
OfusJK

Sfortunatamente non funziona se l'utente PATH non è già definito :(
nowox

@KJK: for /?ti dirà tutto ciò che devi sapere. :) Non volevo replicare tutto inutilmente qui e ho pensato che le informazioni sarebbero state facili da capire comunque.
Karan,

Il codice non verifica se l' utente PATH termina già con un punto e virgola, nel qual caso l'aggiunta della directory passata deve essere eseguita senza un punto e virgola aggiuntivo. Ma il problema più grande con questo codice è una corruzione dell'utente PATH se la stringa supera i 1024 caratteri a causa del setx troncamento della stringa a 1024 caratteri con la visualizzazione di informazioni appropriate prima di aggiungerlo al registro di Windows. Quindi potrebbe accadere che invece di aggiungere la directory passata, l' utente esistente PATHvenga troncato (confonduto) da questo codice.
Mofi,

4

necessità SETX /M, impostazione predefinita SETXimpostata suHKEY_CURRENT_USER

SETX /M PATH c:\my-bin-path;%PATH%

Questo influenza la variabile PATH di sistema ... forse il mio esempio è stato fuorviante, ma mi piacerebbe aggiornare in modo specifico la variabile PATH dell'utente.
Christian Lemer,


1

Questo sembra funzionare:

setx PATH "c:\my-user-specifc-bin-path-which-may-contain-spaces;"%%PATH%%

È assolutamente NO GO, MAI MAI MAI aggiornare l' utente o il sistema PATH utilizzando local PATH . Questa riga di comando corrompe davvero l' utente PATH aggiungendo al registro di Windows per l' utente PATH la stringa 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\;%nel migliore dei casi. Chiunque utilizzi questa riga di comando ha corrotto correttamente le impostazioni dell'utente PATH e quindi locale PATH come utilizzato da tutti i processi in esecuzione con l'account utente corrente dopo il riavvio di Windows o la disconnessione / accesso.
Mofi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.