Esiste uno strumento da riga di comando che può essere utilizzato per modificare le variabili di ambiente in Windows?


15

Esiste uno strumento da riga di comando che può essere utilizzato per modificare le variabili di ambiente in Windows?

Sarebbe bello se questo fosse uno strumento intelligente, ad esempio:

  • Quando si aggiunge un percorso per dire la variabile PATH e questo percorso è già lì non dovrebbe raddoppiare questa voce.
  • L'inserimento di un nuovo percorso nella variabile PATH dovrebbe essere possibile prima / dopo qualche altro percorso o in un ordine specifico (il primo, il settimo, l'ultimo, ecc.).
  • Dovrebbe essere possibile modificare solo una parte del valore della variabile (nel caso del PERCORSO un determinato percorso da un elenco di tutti i percorsi).

E l'ultimo ma non meno importante: voglio che le mie modifiche persistano tra le sessioni, quindi SET semplice è fuori discussione ...

C'è un ottimo strumento GUI per questo chiamato Path Editor e ho bisogno di qualcosa di simile ma per la riga di comando.


4
Tecnicamente si. Si chiama SET. So che non è carino, ma non puoi essere molto più semplice che impostare le variabili con gli strumenti a portata di mano.
Michael Todd,

Interessante. Pensavo che ci sarebbe stato uno strumento di terze parti abbastanza noto per questo.
Sasha Chedygov,

Quale versione di Windows stai utilizzando?
Sasha Chedygov,

@musicfreak Vista Home Premium 64bit
Piotr Dobrogost

Risposte:


16

Non conosco alcuno strumento che lo faccia, ma forse puoi usare il regcomando:

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path

per leggere il percorso corrente e

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /d "newPath" /f

per scrivere il tuo nuovo valore.

È necessario disporre dei diritti di amministratore per accedere correttamente a HKLM. Se questo è un problema, considera invece di modificare l'impostazione del percorso specifico dell'utente HKCU\Environment.


1
Questa risposta avrebbe dovuto essere accettata, può cambiare qualsiasi variabile ambientale e può anche essere incapsulata in un file batch quindi è sufficiente inserire il nome e il nuovo valore.
Tamara Wijsman,

Se questo fosse combinato con Vi, si avvicinerebbe al rispetto dei criteri dell'interrogatore. ad esempio un file batch che scrive il percorso in un file di testo temporaneo, lo apre in vi, quindi quando si chiude vi scrive il file nel percorso. In questo modo puoi facilmente modificare il tuo percorso dalla riga di comando. Ho fatto qualcosa del genere in XP, con un file batch, un blocco note e quei comandi reg.
barlop

1
ATTENZIONE NON copiarlo incautamente a meno che tu non voglia fare qualcosa di stupido ...
n611x007

7

Se è necessario un modo generico per impostare qualsiasi variabile di ambiente e le modifiche persistono, setx.exe sarebbe lo strumento da utilizzare. Non può fare le cose "intelligenti" che stai chiedendo, però ...

setx.exe è incluso in Windows Vista o versioni successive; se si utilizza una versione precedente di Windows, è possibile utilizzare il link di download sopra per ottenerlo.


5

Per il programma attuale, c'è path:

Visualizza o imposta un percorso di ricerca per i file eseguibili.

PATH [[drive:]path[;...][;%PATH%]
PATH ;

Digitare PATH ;per cancellare tutte le impostazioni del percorso cmd.exedi ricerca e indirizzare alla ricerca solo nella directory corrente.

Digitare PATHsenza parametri per visualizzare il percorso corrente. Includendo %PATH%nella nuova impostazione del percorso, il vecchio percorso verrà aggiunto alla nuova impostazione.

Tuttavia, questo è praticamente lo stesso di set PATH.

Affinché le variabili di ambiente persistano, è necessario modificare il registro o utilizzare setx.


3

Ho appena scoperto la possibilità di consentire agli utenti di eseguire la finestra di dialogo di modifica delle variabili di ambiente senza privilegi elevati.

Dal menu Start, eseguire quanto segue:

rundll32 sysdm.cpl,EditEnvironmentVariables

2
+1 per un modo da riga di comando per accedere al widget di modifica della GUI, perché è sicuramente più semplice rispetto al percorso del clic, anche se la risposta è fuori tema perché Q riguarda la modifica del PERCORSO dalla riga di comando.
matt wilkie,

2

impostare PERCORSO

(aiuto impostato)


1
questo è solo per la sessione terminale e per aggiungere / modificare valori è necessario digitare nuovamente l'intero percorso precedente.
John T,

2
Non vero. SET PATH =% path%; c: \ newpath
Michael Todd,

2
l'hai ancora digitato, semplicemente non espanso :) Anche questo non salverà, prova ad uscire dal prompt dei comandi e aprirne uno nuovo, quindi controlla il tuo percorso.
John T,

Non ha specificato se doveva persistere tra le sessioni.
Sangretu,

4
Bene, se hai verificato cosa fa Patheditor (il suo suggerimento), lo salva in modo permanente. set PATH è veramente usato solo negli script di build per i programmi perché è temporaneo.
John T,

2

Potresti voler dare un'occhiata al percorso della collezione gtools: http://www.p-nand-q.com/gtools.html

Fornisce una serie di comandi per il comando promt like

pathed /APPEND %CD% /USER

per aggiungere il percorso corrente, ad esempio. A dire il vero non l'ho ancora verificato, perché sto benissimo usando una GUI.

Altre opzioni sono:

  /MACHINE: print machine PATH
     /USER: print user PATH
      /ADD: add variable at the head
   /APPEND: add variable at the tail
   /REMOVE: remove path / index
     /SLIM: strip duplicate vars
      /ENV: environment variable, defaults to PATH

Insieme a quale della stessa collezione, ti sei procurato dei buoni strumenti, suppongo. Che "individua i file eseguibili sul PERCORSO".

 /EXTENSION: search for extension , can be a ; separated list
       /DIR: add directory , can be a ; separated list
 /RECURSIVE: search directories recursively
    /SINGLE: stop after the first find result
       /ENV: environment variable, defaults to PATH
FILE {FILE}: one or more files to find

Fonte: http://op111.net/82/


1
Puoi spiegare a cosa stai collegando? Le risposte di solo collegamento possono diventare non valide se il contenuto collegato non è disponibile.
bwDraco,

Sicuro. Mi dispiace mi riferivo implicitamente alla domanda.
hugo der hungrige,

Sembra che l'URL per Gtools e il percorso sia ora morto. p-nand-q.com/gtools.html
DevPlayer

1

Ho scritto una serie di script batch per questo. addpath.bat aggiunge elementi al percorso, rmpath.bat rimuove gli elementi dal percorso e lpath.bat elenca semplicemente il percorso. Ma poi avevo bisogno di alcuni script di supporto, quindi c'è anche chkpath.bat.

Alla fine non è stato banale e ha richiesto tr.exe e cat.exe, un paio di utility in stile unix. Il motivo non è banale: nessun backtick in cmd.exe (anche se è possibile utilizzare per i loop per questo) e nomi brevi anziché nomi lunghi.

addpath.bat:

@echo off
setlocal
set cwd=%~dps0

goto testit

:loopy

call %cwd%chkpath "%~1"
if %errorlevel%==2 (
  set path=%path%;%~1
)

shift

:testit
if not _%1==_ goto loopy


call %cwd%lpath.bat

endlocal & set path=%path%

ChkPath.bat:

@echo off
goto START

-------------------------------------------------------
chkpath.bat

checks path for existence of the given segment.
Returns 1 if present, 2 if not present, 0 if not checked.

The matching and checking complicated by case sensitivity and "short pathnames".

created sometime in 2003 and lovingly maintained since then.


-------------------------------------------------------

:START
setlocal enabledelayedExpansion
set rc=0
set cwd=%~dps0
set curdrive=%~d0
set tr=%curdrive%\bin\tr.exe
set regexe=%windir%\system32\reg.exe


if _%1==_ goto Usage


@REM convert arg 1 to a fully-qualified, short path name,
@REM and then convert to uppercase.
set toupper=%~fs1
call :ToUpper
set tocheck=%toupper%


if not _%TEMP%==_ goto GotTemp
call :gettemp


:GotTemp
set d=%DATE:~4%
set stamp=%d:~6%%d:~3,2%%d:~0,2%%TIME::=%
set d=
set tempfile1=%TEMP%\chkpath1-%stamp%.tmp

echo %path% | %tr% ; \n  >  %tempfile1%

@REM check each element in the path for the match:
for /f  "delims=^" %%I in (%tempfile1%) do (
  if !rc!==0 (
call :CheckElt "%%I"
  )
)

if %rc%==0 set rc=2
goto END


--------------------------------------------
* checkelt
*
* check one element in the path to see if it is the same
* as the TOCHECK string. The element is first canonicalized.
*

:CheckElt
@REM remove surrounding quotes
set ERF=%1
if [x%ERF%]==[x] goto CheckEltDone
@REM convert to fully-qualified, short paths, uppercase
set TOUPPER=%~fs1%
call :ToUpper
if _%TOCHECK% == _%TOUPPER% set rc=1
:CheckEltDone
goto:EOF
--------------------------------------------


--------------------------------------------
* backtick
*
* invoke a command and return the result as a string.
* This is like backtick in csh or bash.
* To call, set variable BACKTICK to the command to be run.
* The result will be stored in the env variable of the same name.
*

:backtick
FOR /F "usebackq delims=" %%i IN (`%backtick%`) DO (
  SET backtick=%%i
)
goto backtick_done
:backtick_none
  SET backtick=nothing to exec
:backtick_done
goto:EOF
--------------------------------------------


--------------------------------------------
* gettemp
*
* get the temporary directory, as stored in the registry.
* Relies on backtick.
*
* The result set TEMP.
*

:gettemp
set regkey=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
set regvalname=Local AppData
set backtick=%regexe% query "%regkey%" /v "%regvalname%"
call :backtick
for /f "tokens=4" %%a in ("%backtick%") do (
  set temp=%%a
)
goto:EOF
--------------------------------------------



--------------------------------------------
* ToUpper
*
* Convert a string to all uppercase.
* To call, set variable TOUPPER to the thing to be converted.
* The result will be stored in the env variable of the same name.
*

:ToUpper
  FOR /F "usebackq delims=" %%I IN (`echo %toupper% ^| %tr% a-z A-Z`) DO (
SET toupper=%%I
  )
goto:EOF
--------------------------------------------


--------------------------------------------
:CleanUp
  if _%tempfile1%==_ goto CleanUpDone
  if exist %tempfile1% del %tempfile1%
  :CleanUpDone
goto:EOF
--------------------------------------------


--------------------------------------------
:Usage
echo.
echo Usage: chkpath ^<path^>
echo checks if path element is included in path variable.
echo returns 1 if yes, 2 if no, 0 if not checked.
echo.
goto END
--------------------------------------------


:END
call :CleanUp

:ReallyEnd

endlocal & set errorlevel=%rc%
@REM set errorlevel=%rc%
@REM echo %errorlevel%

lpath.bat:

@echo.
@set curdrive=%~d0

@REM This form post-fixes a | at the end of each path element. Useful for debugging trailing spaces.
@REM @path | %curdrive%\cygwin\bin\sed.exe -e s/PATH=// -e 's/;/^|\n/g' -e 's/$/^|/g'

@REM This form shows bare path elements.
@REM @path | %curdrive%\cygwin\bin\sed.exe -e 's/PATH=//' -e 's/;/^\n/g'
@path | %curdrive%\utils\sed -e "s/PATH=//" | %curdrive%\utils\tr ; \n
@echo.

Penso che il forloop potrebbe essere usato al posto di tr/ cattroppo.
user1686,

0

Path Manager (pathman.exe) dagli strumenti del Resource Kit di Windows Server 2003 è la corrispondenza più vicina che ho trovato. Era già disponibile in NT Resource Kit.


forse provaresetx.exe
n611x007

@ n611x007, setxè per le variabili di ambiente generali; pathmanè specificamente per manipolare (cioè analizzare ) il percorso.
Synetech,

0

Come verificare se la directory esiste in% PATH%? su Stack Overflow ha una descrizione eccezionale di ciò che rende difficile la modifica di PATH di Windows insieme a un file batch per superarli. Capire come usare correttamente addpath.batha richiesto un po 'di pratica poiché la sua struttura di chiamata era nuova per me, ma funziona:

set _path=C:\new\directory\to\add\to\path
call addpath.bat _path
set _path=

e ripetuti licenziamenti non aggiungeranno la nuova directory se è già presente. Questo non risolve il problema rendendo persistenti le modifiche tra le sessioni.

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.