Удалить нежелательное имя пути из переменной% path% через пакет

Область применения: Windows XP или новее Инструменты: пакетный скрипт

Мне нужно удалить ненужное имя пути из переменной%% PATH. Я знаю, как добавить новое имя пути в переменную system% PATH%, используя такой инструмент, как SETX.EXE, который также сразу же становится доступным в существующей среде CMD. Вероятно, это вопрос использования FIND и/или цикла FOR, но я не совсем уверен, как это сделать. Вот пример инструкции пути...

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

Из этого я должен уметь удалить полное имя пути, относящееся к "oracle". Итак, в приведенном выше примере мне нужно удалить "C:\oracle\product\10.2.0\bin" из вышеуказанного оператора пути. К сожалению, не только имя пути оракула может отличаться от приведенного выше, могут быть несколько названий путей оракула, и все их нужно удалить. Я попытался реализовать решение здесь...

Как я могу извлечь полный путь из переменной среды PATH?

Однако он просто не работает. Сценарий не найдет имя пути. Любая помощь будет оценена по достоинству. Спасибо.

Ответы

Ответ 1

Вы можете попробовать что-то вроде этого:

@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!

Я положил echo на последнюю строку. Проверьте результат, и если он подходит для вас, удалите его.

Ответ 2

Это удаляет подстроку C:\Program Files (x86)\Git\bin; из строки PATH и повторно назначает:

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

Вы можете использовать это, чтобы увидеть изменение:

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

Примечание: будьте точны на подстроке. Он чувствителен к регистру и чувствителен к косе.

Если вам нужно сделать постоянное изменение, используйте setx вместо set и откройте другую консоль, чтобы изменения вступили в силу.

setx /M PATH "%PATH:C:\Program Files (x86)\Git\bin;=%"

Ответ 3

Попробовав ответы SachaDee, я получил ошибки с такими путями, как

C:\Program Files (x86)

в скобках: Program Files (x86)\Directory дала мне

Каталог was unexpected at this time. (независимо от того, во сколько я попробовал это)

я добавил

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

перед циклом и

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

после цикла (не уверен, если это необходимо)

@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!

И это сейчас работает.

Ответ 4

Я нашел другие решения этой проблемы немного неловкими, я действительно не хочу полагаться на точные пути, сложный синтаксис "отложенного расширения", удаляя пробелы для цикла "for/f", а затем добавляя их обратно в...

Я думаю, что это более изящно, и я прокомментировал, черт возьми, так, что даже кто-то новичок в ужасах Batch может следовать.

::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