Как бы вы написали файл .bat или .cmd для удаления элемента из PATH? - PullRequest
5 голосов
/ 16 сентября 2009

Связанный:
Как перечислить элементы пути в командном файле?
Как работает FOR?

Как бы вы написали командный файл или файл CMD, чтобы удалить элемент из пути? Должен обращаться изящно:

  • различия в регистре
  • короткие и длинные имена

Я сделал это с помощью tr.exe, но он медленный и сложный и использует временные файлы, что делает его еще более сложным.

Я думаю ответ примерно такой:

setlocal
set tpath="" 
set _path="%PATH:;=" "%"
for %%p in (%_path%) do (
   call :KeepIfNotEqual %%p %elementToRemove% 
)
endlocal & set path=%tpath%

... где% elementToRemove% - удаляемый элемент пути. KeepIfUnique должна быть подпрограммой, которая принимает два аргумента - имена каталогов, нормализует их и добавляет первый аргумент к tpath, если он не равен ко второму аргументу (elementToRemove).

Как я уже сказал, я могу сделать это с помощью tr.exe, но могу ли я сделать это только с помощью встроенных команд в оболочке windows cmd.exe?

РЕДАКТИРОВАТЬ : Я полагаю, когда вы дойдете до этого, вопрос, как сделать преобразование регистра в cmd.exe?

Ответы [ 3 ]

4 голосов
/ 16 сентября 2009

Вот что я придумал, используя подсказку Игоря.

@echo off
goto START

-------------------------------------------------------
 rmpath.bat

 remove a path element from path 

 Created Tue Sep 15 21:33:54 2009 

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

:START
SETLOCAL ENABLEDELAYEDEXPANSION 

@REM require one argument (the path element to remove)
if  _%1==_ goto USAGE

@REM  ~fs = remove quotes, full path, short names
set fqElement=%~fs1

@REM convert path to a list of quote-delimited strings, separated by spaces
set fpath="%PATH:;=" "%"

@REM iterate through those path elements
for %%p in (%fpath%) do (
    @REM  ~fs = remove quotes, full path, short names
    set p2=%%~fsp
    @REM is this element NOT the one we want to remove?
    if /i NOT "!p2!"=="%fqElement%" (
        if _!tpath!==_ (set tpath=%%~p) else (set tpath=!tpath!;%%~p)
    )
)

set path=!tpath!

@call :LISTPATH

goto ALL_DONE
-------------------------------------------------------

--------------------------------------------
:LISTPATH
  echo.
  set _path="%PATH:;=" "%"
  for %%p in (%_path%) do if not "%%~p"=="" echo     %%~p
  echo.
  goto :EOF
--------------------------------------------


--------------------------------------------
:USAGE
  echo usage:   rmpath ^<arg^>
  echo     removes a path element from the path.
  goto ALL_DONE

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

:ALL_DONE
ENDLOCAL & set path=%tpath%
1 голос
/ 16 сентября 2009

if команда игнорирует опцию регистра

if /I "Blah"=="blah" (echo true) else (echo false)

См. if /? для получения дополнительной помощи по его использованию. Обычно я нашел эти команды полезными для определения того, как сделать некоторые хитрости строки cmd:

if /?
call /?
for /?
set /?
0 голосов
/ 17 марта 2016

Я хочу добавить что-то к ответу Cheeso ... но мне не хватает представителя, чтобы добавить комментарий.

Если вы хотите, чтобы предоставленный им скрипт работал даже после того, как пакетный файл закончен, измените последнюю строку следующим образом:

@echo off
  . . .
  . . .
SETLOCAL ENABLEDELAYEDEXPANSION
  . . .
  . . .
endlocal & set path=%tpath%

При этом используется хитрый трюк: переменная 'tpath' доступна, когда эта строка считывается и анализируется cmd.exe и расширяется до удаления с помощью 'endlocal .

Это позволяет изменениям переменной 'PATH' сохраняться даже после выхода из пакетного файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...