CMD: Добавить к пути, не дублируя его?

CMD: Добавить к пути, не дублируя его?

За один CMDсеанс я могу легко задать новый путь:SET PATH=%PATH%;"insert custom path here"

При выполнении этого в пакетном файле не учитывается, включен ли уже пользовательский путь. Как избежать его дублирования (т. е. проверить, содержится ли он уже в "строке" PATH).

Замечания:

  1. Связанный:Как добавить пользовательские переменные среды к системной переменной PATH в Windows 7?
  2. Связанный:Как можно навсегда добавить запись в системную переменную PATH через командную строку?
  3. Тот же вопрос для UNIX:Добавить каталог в $PATH, если его там еще нет
  4. Объяснение некоторых строковых операций "CMD":http://ss64.com/nt/syntax-replace.html

решение1

Похоже на ответ MaddHackers, только более компактно.
echo %path%|find /i "%np%">nul || set path=%path%;%np%

%np%ваш новый путь, конечно, вы можете использовать вместо него литералы. Что он делает: echo %path%|find /i "%np%">nulищет существующий путь для строки, отбрасывая вывод. ||означает выполнить при неудаче, поэтому это означает: Найдите путь к строке, которую необходимо добавить, и если она не найдена, добавьте ее.

Редактировать: Обычно не требуется заключать пути в кавычки, даже те, которые содержат пробелы, ноесли вы хотите их процитировать, эта версия будет работать с путями в двойных кавычках:
echo %path%|find /i "%np:"=%">nul || set path=%path%;%np%

Редактировать: изменено findstr /i /c:на find /iтак как findstrможет неправильно истолковывать некоторые последовательности, как отметил KubaOber в комментариях

решение2

Я знаю, что это грязно, но это должно сработать:

 SET PATH=$(echo $PATH | awk -F"%checkstr%" '{ print ($(NF-1) ~ 0) ? $PATH:%newpath% : $PATH; }')

где %checkstr%находится строка, которую нужно проверить в PATH, и %newpath%где находится новый PATH, который нужно добавить к текущему PATH

Надеюсь, это поможет, и я уверен, что есть более простой способ, но на данный момент этого должно хватить.

РЕДАКТИРОВАТЬ

Поэтому, если вы не хотите добавлять инструменты UNIX в Windows, вы можете попробовать следующий синтаксис пакета:

echo %PATH% | find /C /I "<string to find>" > out.txt 
set /p dne= < out.txt
if 0 EQU %dne% (set PATH=%PATH%;"<custom path>")
del out.txt

Уф, не красивее, и можно сделать в одну строку, если заставить команду find работать как подкоманда в операторе if...

решение3

Скрипт основан на ответе "wmz":

@ECHO off
ECHO java_home=%JAVA_HOME%
SET javapath=%JAVA_HOME%\bin
ECHO %path%|findstr /i /c:"%javapath:"=%">nul || set path=%path%;%javapath%
ECHO Path=%path%
PAUSE

решение4

Обновленный ответ на 2021 год:

setбольше не работает, и нам нужно использовать setx(немного другой синтаксис):

SET mypath=C:\dev\vendor\sass\1.32.4
ECHO %Path%|findstr /i /c:"%mypath:"=%">nul || setx Path "%Path%";%mypath%

Связанный контент