Come posso aggiungere in modo permanente una voce nella variabile PATH del sistema, tramite riga di comando?


13

Cosa devo fare:

  • Aggiungi una cartella alla %PATH%variabile d'ambiente a livello di SISTEMA.
  • Rendi permanente la modifica.

Come devo farlo:

  • Utilizzando il prompt dei comandi o un altro metodo con cui tutti i comandi necessari possono essere scritti in un .BATfile.
  • Utilizzando solo strumenti che sarebbero disponibili su una semplice installazione di Windows XP SP3, senza connettività Internet.
  • Preferirei eseguire lo script localmente, ma ho anche accesso remoto ai sistemi di destinazione. Tieni presente, tuttavia, che non posso presumere che servizi non predefiniti (ad esempio: registro remoto) siano abilitati sui sistemi.

Sistemi su cui lo script deve funzionare:

  • Windows XP SP3
  • Windows Server 2003 SP2
  • Windows 7 SP1
  • Windows Server 2008 R2 SP1

Conosco abbastanza bene il SETcomando, ma sono anche consapevole che generalmente sovrascriverà la variabile esistente invece di aggiungerla. Questo non è accettabile Esiste un altro strumento (o opzione per SETcui non sono a conoscenza) che verrà invece aggiunto alla variabile? O devo inserire una soluzione alternativa nello script che include la copia temporanea della variabile esistente in un'altra variabile o file di testo?

Inoltre, è mia comprensione che SETnon modificherà in modo permanente la variabile. Ne ho già parlato SETX, ma questo non sembra incorporato in Windows XP SP3 (o, almeno, non sembra essere disponibile sul sistema su cui sto lavorando). C'è un altro modo per rendere permanente la modifica, tramite la modifica del registro o qualcosa del genere?

Mi sono guardato intorno e ho imparato molto da qui sull'impostazione delle variabili di ambiente in Windows. Tuttavia, non ho ancora trovato una domanda duplicata esatta adatta alle mie esigenze. Se ce n'è uno, per favore fatemelo sapere.


Setx non viene fornito con XP. È in uno o più dei kit di risorse, ma dimentico quale sbrigativo. Per apportare modifiche permanenti alle variabili d'ambiente dalla riga di comando è sicuramente il modo più semplice. È possibile apportare le modifiche nel registro (HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment) ma le modifiche al registro dalla riga di comando non sono un problema. Se fossi in te, scriverei un VBScript per farlo.
EBGreen

@EBGreen Conosco un po 'di familiarità con REGle modifiche al registro. Se desideri pubblicarlo come risposta, con suggerimenti su come conservare il percorso esistente, almeno darei un voto positivo.
Iszi,

1
Penso, secondo il suggerimento di EBGreen, ho capito come devo farlo. Ora vorrei solo che ci fosse un modo per forzare l'aggiornamento del registro (e spingere verso le variabili di ambiente) senza riavviare o ricaricare Explorer?
Iszi,

1
@EBGreen Sì, è così. A proposito, se hai del tempo per capire la sintassi, potresti per favore postare una risposta effettiva? Preferirei che questo non si trasformasse in una domanda a risposta autonoma.
Iszi,

1
@lszi, dovresti rispondere alla tua domanda. Una buona risposta a una buona domanda è utile, anche quando rispondi tu stesso.
Myrddin Emrys,

Risposte:


4

Quanto segue aggiunge "C: \ bin" al percorso e quindi salva il nuovo percorso nel registro:

set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %path% /f

L'ho provato solo su XP SP3, ma dovrebbe funzionare anche su una versione più recente.

Suppongo che un nuovo utente che accede prima del riavvio della macchina potrebbe non ottenere il nuovo percorso.

Harry ha ragione con il suo commento su% SystemRoot%, se vuoi mantenerli, devi prima estrarre il vecchio valore per path dal registro:

@echo OFF

set KEY_NAME="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
set VALUE_NAME=Path

FOR /F "usebackq skip=4 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
  set ValueName=%%A
  set ValueValue=%%C
)

if defined ValueName (

  set newPath=%ValueValue%;C:\bin

  reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %newPath% /f

  set path=%path%;C:\bin

) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found.
)

2
Tenere presente che ciò modificherà alcune delle voci PATH esistenti espandendo i riferimenti alle variabili di ambiente. Ad esempio, la voce standard% SystemRoot% \ system32 verrà sostituita con c: \ windows \ system32. Questo esempio particolare non importa perché SystemRoot è una costante, ma se qualcuno ha impostato un PERCORSO con un riferimento a una variabile di ambiente che cambia, la interromperai. (Lo faccio su alcuni dei miei computer per indicare la directory bin nell'attuale Sun JDK.)
Harry Johnston,

Il nuovo script non funziona come scritto se il percorso contiene parentesi, ad esempio riferimenti a Program Files (x86).
Harry Johnston,

-1
set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d ^%path^% /f

2
Mentre i comandi nudi possono essere utili, ci aspettiamo un po 'più di lavoro nelle nostre domande / risposte. Spiegare in che modo risponde alla domanda dei PO.
Ƭᴇcʜιᴇ007,
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.