Existe-t-il un outil de ligne de commande qui peut être utilisé pour modifier les variables d'environnement dans Windows?

15

Existe-t-il un outil de ligne de commande qui peut être utilisé pour modifier les variables d'environnement dans Windows?

Ce serait bien si c'était un outil intelligent, par exemple:

  • Lorsque vous ajoutez un chemin pour, disons, la variable PATH et que ce chemin est déjà là, il ne devrait pas doubler cette entrée.
  • L'insertion d'un nouveau chemin dans la variable PATH devrait être possible avant / après un autre chemin ou dans un ordre spécifique (le premier, le 7, le dernier etc.).
  • Il devrait être possible de ne changer qu'une partie de la valeur de la variable (dans le cas du CHEMIN, un chemin donné à partir d'une liste de tous les chemins).

Et le dernier mais non le moindre - je veux que mes changements persistent entre les sessions, donc un SET simple est hors de question ...

Il y a un très bon outil GUI pour cela appelé Path Editor et j'ai besoin de quelque chose comme ça mais pour la ligne de commande.

Piotr Dobrogost
la source
4
Techniquement, oui. Cela s'appelle SET. Je sais que ce n'est pas joli, mais vous ne pouvez pas être beaucoup plus simple que de simplement définir les variables avec les outils à portée de main.
Michael Todd
Intéressant. Je pensais à coup sûr qu'il y aurait un outil tiers assez bien connu pour cela.
Sasha Chedygov
Quelle version de Windows utilisez-vous?
Sasha Chedygov
@musicfreak Vista Home Premium 64bit
Piotr Dobrogost

Réponses:

16

Je ne connais aucun outil qui le fasse, mais peut-être pouvez-vous utiliser la regcommande:

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

pour lire le chemin actuel, et

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

pour écrire votre nouvelle valeur.

Vous avez besoin des droits d'administrateur pour accéder correctement à HKLM. Si cela pose problème, envisagez HKCU\Environmentplutôt de modifier le paramètre de chemin d'accès spécifique à l'utilisateur .

Treb
la source
1
Cette réponse aurait dû être acceptée, elle peut changer n'importe quelle variable d'environnement et peut même être encapsulée dans un fichier batch, il suffit donc de saisir le nom et la nouvelle valeur.
Tamara Wijsman
Si cela est combiné avec Vi, cela se rapprocherait plus des critères du questionneur. Par exemple, un fichier batch qui écrit le chemin d'accès dans un fichier texte temporaire, l'ouvre dans vi, puis lorsque vous fermez vi, il écrit le fichier dans le chemin d'accès. De cette façon, vous pouvez facilement modifier votre chemin via la ligne de commande. J'ai fait quelque chose comme ça dans XP, avec un fichier batch, un bloc-notes et ces commandes reg.
barlop
1
AVERTISSEMENT ne copiez-collez pas sans réfléchir sauf si vous voulez faire quelque chose de stupide ...
n611x007
7

Si vous avez besoin d'un moyen générique pour définir n'importe quelle variable d'environnement et que les modifications persistent, alors setx.exe serait l'outil à utiliser. Il ne peut pas faire les choses "intelligentes" que vous demandez, cependant ...

setx.exe est inclus avec Windows Vista ou version ultérieure; si vous utilisez une version antérieure de Windows, vous pouvez utiliser le lien de téléchargement ci-dessus pour l'obtenir.

bobbymcr
la source
5

Pour le programme actuel, il y a path:

Affiche ou définit un chemin de recherche pour les fichiers exécutables.

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

Tapez PATH ;pour effacer tous les paramètres du chemin cmd.exede recherche et dirigez-vous vers la recherche uniquement dans le répertoire actuel.

Tapez PATHsans paramètres pour afficher le chemin actuel. L'inclusion %PATH%dans le nouveau paramètre de chemin entraîne l'ajout de l'ancien chemin au nouveau paramètre.

Cependant, c'est à peu près la même chose que set PATH.

Pour que les variables d'environnement persistent, vous devez modifier le registre ou utiliser setx.

Joey
la source
3

Je viens de découvrir la possibilité d'autoriser les utilisateurs à exécuter la boîte de dialogue d'édition des variables d'environnement sans privilèges élevés.

Dans le menu Démarrer, exécutez ce qui suit:

rundll32 sysdm.cpl,EditEnvironmentVariables
David Tersigni
la source
2
+1 pour un moyen en ligne de commande d'accéder au widget d'édition de l'interface graphique, car c'est certainement plus simple que le chemin de clic, même si la réponse est hors sujet car Q concerne la modification de PATH à partir de la ligne de commande.
matt wilkie
2

définir le CHEMIN

(ensemble d'aide)

sangretu
la source
1
ceci est uniquement pour la session de terminal, et pour ajouter / modifier des valeurs, vous devez également retaper l'ancien chemin entier.
John T
2
Pas vrai. SET PATH =% path%; c: \ newpath
Michael Todd
2
vous l'avez toujours tapé, juste non développé :) Cela ne sera pas non plus enregistré, essayez de quitter l'invite de commande et d'en ouvrir une nouvelle, puis vérifiez votre chemin.
John T
Il n'a pas précisé s'il devait persister entre les sessions.
sangretu
4
Eh bien, si vous avez vérifié ce que fait patheditor (sa suggestion), il l'enregistre de façon permanente. set PATH n'est vraiment utilisé que dans les scripts de construction de programmes car il est temporaire.
John T
2

Vous voudrez peut-être consulter le chemin de la collection gtools: http://www.p-nand-q.com/gtools.html

Il fournit un ensemble de commandes pour l'invite de commande comme

pathed /APPEND %CD% /USER

pour ajouter le chemin actuel par exemple. Je ne l'ai pas vraiment vérifié pour être honnête, car je suis tout à fait d'accord avec l'utilisation d'une interface graphique.

Les autres options sont:

  /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

Avec lequel de la même collection, vous vous êtes procuré de bons outils, je suppose. Qui "localise les fichiers exécutables sur le CHEMIN".

 /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

Source: http://op111.net/82/

hugo der hungrige
la source
1
Pouvez-vous expliquer à quoi vous liez? Les réponses de lien uniquement peuvent devenir invalides si le contenu lié devient indisponible.
bwDraco
Shure. Désolé, je me référais implicitement à la question.
hugo der hungrige
Il semble que l'URL de Gtools et son chemin soient désormais morts. p-nand-q.com/gtools.html
DevPlayer
1

J'ai écrit un ensemble de scripts batch pour cela. addpath.bat ajoute des éléments au chemin, rmpath.bat supprime des éléments du chemin et lpath.bat répertorie simplement le chemin. Mais alors j'avais besoin de quelques scripts de support, donc il y a aussi chkpath.bat.

Il a fini par ne pas être trivial et a nécessité tr.exe et cat.exe, quelques utilitaires de style Unix. La raison n'est pas anodine: pas de backticks dans cmd.exe (bien que vous puissiez utiliser pour les boucles pour cela), et les noms courts par rapport aux noms longs.

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.
Cheeso
la source
Je pense que la forboucle pourrait être utilisée à la place de tr/ cataussi.
user1686
0

Gestionnaire de chemins d'accès (pathman.exe) à partir des outils du Kit de ressources Windows Server 2003 est la correspondance la plus proche que j'ai pu trouver. Il était déjà disponible dans NT Resource Kit.

Piotr Dobrogost
la source
essayez peut-êtresetx.exe
n611x007
@ n611x007, setxconcerne les variables d'environnement générales; pathmanest spécifiquement pour manipuler (c'est-à-dire analyser ) le chemin.
Synetech
0

Comment vérifier si le répertoire existe dans% PATH%? sur Stack Overflow a une description exceptionnelle de ce qui rend l'édition de PATH Windows difficile avec un fichier de commandes pour les surmonter. Déterminer comment utiliser correctement a addpath.batpris un peu de pratique car sa structure d'appel était nouvelle pour moi, mais cela fonctionne:

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

et les cuissons répétées n'ajouteront pas le nouveau répertoire s'il est déjà présent. Cela ne permet pas de rendre les modifications persistantes d'une session à l'autre.

Matt Wilkie
la source