web-dev-qa-db-fra.com

Supprimer le nom de chemin indésirable de la variable% path% via le lot

Portée: Windows XP ou plus récent Tools: Batch script

J'ai besoin de pouvoir supprimer un nom de chemin inutile de la variable système% PATH%. Je sais comment ajouter un nouveau nom de chemin à la variable système% PATH%, en utilisant un outil tel que SETX.EXE, qui le rend également immédiatement disponible dans l'environnement CMD existant. Il s'agit probablement d'utiliser FIND et/ou une boucle FOR, mais je ne sais pas trop comment y parvenir. Voici un exemple de déclaration de chemin ...

%PATH% = C:\;C:\Program Files\Common Files\Java;C:\Oracle\product\10.2.0\bin;C:\WINDOWS;C:\WINDOWS\system32;

De cela, je dois pouvoir supprimer le nom de chemin complet lié à "Oracle". Ainsi, dans l'exemple ci-dessus, je dois pouvoir supprimer le "C:\Oracle\product\10.2.0\bin" de l'instruction de chemin ci-dessus. Malheureusement, non seulement le nom du chemin Oracle peut être différent de celui indiqué ci-dessus, il peut y avoir plusieurs noms de chemin Oracle et tous doivent être supprimés. J'ai essayé d'implémenter la solution ici ...

Comment puis-je extraire un chemin complet de la variable d'environnement PATH?

Cependant, cela ne fonctionne tout simplement pas. Le script ne trouverait pas le nom du chemin. Toute aide serait appréciée. Merci.

22
user3208239

Vous pouvez essayer quelque chose comme ceci:

@echo off&cls
setlocal EnableDelayedExpansion
set $line=%path%
set $line=%$line: =#%
set $line=%$line:;= %

for %%a in (%$line%) do echo %%a | find /i "Oracle" || set $newpath=!$newpath!;%%a
set $newpath=!$newpath:#= !
echo set path=!$newpath:~1!

J'ai mis un echo à la dernière ligne. Vérifiez le résultat et si cela vous convient, supprimez-le.

5
SachaDee

Cela supprime la sous-chaîne C:\Program Files (x86)\Git\bin; de la chaîne PATH et réaffecte:

set PATH=%PATH:C:\Program Files (x86)\Git\bin;=%

Vous pouvez utiliser ceci pour voir le changement:

echo %PATH:C:\Program Files (x86)\Git\bin;=% | tr ; \n

Remarque: soyez exact sur la sous-chaîne. Il est sensible à la casse et aux barres obliques.

Si vous devez en faire une modification persistante, utilisez setx au lieu de set et ouvrez une autre console pour que les modifications prennent effet.

setx /M PATH "%PATH:C:\Program Files (x86)\Git\bin;=%"
35
Jens A. Koch

Après avoir essayé les réponses de SachaDee, j'ai eu des erreurs avec des chemins comme

C:\Program Files (x86)

avec des crochets: Program Files (x86)\Directory m'a donné

Répertoirewas unexpected at this time. (Peu importe l'heure à laquelle je l'ai essayé)

J'ai ajouté

set $line=%$line:)=^^)%

avant la boucle for et

set $newpath=!$newpath:^^=!

après la boucle (je ne sais pas si c'est nécessaire)

@echo off
setlocal EnableDelayedExpansion
set path
set $line=%path%
set $line=%$line: =#%
set $line=%$line:;= %
set $line=%$line:)=^^)%

for %%a in (%$line%) do echo %%a | find /i "Oracle" || set $newpath=!$newpath!;%%a
set $newpath=!$newpath:#= !
set $newpath=!$newpath:^^=!
set path=!$newpath:~1!

Et cela fonctionne maintenant.

6
Joe

J'ai trouvé les autres solutions à ce problème un peu gênantes, je ne veux pas vraiment compter sur des chemins exacts, une syntaxe complexe `` d'expansion retardée '', supprimer des espaces pour la boucle `` for/f '' puis les ajouter à nouveau ...

Je pense que c'est plus élégant, et j'ai commenté l'enfer pour que même quelqu'un de nouveau aux horreurs de Batch puisse suivre.

::Turn off command display and allows environmental variables to be overridden for the current session
@echo off & setlocal

::Creates a unique file to use for the 'for loop'
set "TMPFILE="%temp%\tmp%RANDOM%%RANDOM%.txt""

::Duplicate PATH into OLDPATH
set "OLDPATH=%PATH%"

::Declare label for the 'goto' command
:Loop

::Extract the first text token with the default delimiter of semicolon
for /f "tokens=1 delims=;" %%G in ("%OLDPATH%") do (

REM Copy text token to TMPFILE unless what we want to remove is found
<NUL set /p="%%G" | find /i "StRiNgThAtMaTcHeSwHaTtOrEmOvE" >NUL 2>&1 || <NUL set /p="%%G;" >>%TMPFILE%

REM Remove text token from OLDPATH
set "OLDPATH=%OLDPATH:*;=%"
)

::Repeat loop until OLDPATH no longer has any delimiters, and then add any remaining value to TMPFILE
echo %OLDPATH% | findstr /C:";" >NUL && (goto :Loop) || <NUL set /p="%OLDPATH%" >>%TMPFILE%

::Set the path to TMPFILE
for /f "usebackq delims=" %%G in (%TMPFILE%) do (set "PATH=%%G")

::Clean-up
del %TMPFILE% >NUL 2>&1

::An echo and pause just for debug purposes
echo %PATH%
pause
0
Vopel