8

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

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

Примечания:

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

3 ответа3

9

Похоже на ответ 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 в комментариях

4

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

 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 из pipe работать как подкоманду в операторе if ...

2

Сценарий, основанный на ответе "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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .