Удалить нежелательное имя пути из переменной% 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