За один CMD
сеанс я могу легко задать новый путь:SET PATH=%PATH%;"insert custom path here"
При выполнении этого в пакетном файле не учитывается, включен ли уже пользовательский путь. Как избежать его дублирования (т. е. проверить, содержится ли он уже в "строке" PATH).
Замечания:
- Связанный:Как добавить пользовательские переменные среды к системной переменной PATH в Windows 7?
- Связанный:Как можно навсегда добавить запись в системную переменную PATH через командную строку?
- Тот же вопрос для UNIX:Добавить каталог в $PATH, если его там еще нет
- Объяснение некоторых строковых операций "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%