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

12

Для одного 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
Хорст Уолтер
источник
Следует отметить, что в этом контексте дублирование безвредно. Вероятно, было бы более разумно разрешить дублирование, чем пытаться избежать его и создать риск ложного срабатывания.
Гарри Джонстон

Ответы:

14

Похоже на ответ 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 /ias findstrможет неверно истолковывать некоторые последовательности, как отмечено KubaOber в комментариях

WMZ
источник
Хорошо, я знал, что есть более чистый способ сделать это ... все еще предпочитаю bash, но это только я: D Спасибо за помощь!
MaddHacker
Хорошо, но работает ли с пробелами в пути? Я проверил это с моими конкретными путями, один "цитируемый и с пробелами" снова добавлен. Один только что процитировал, но без пробелов, кажется, работает.
Хорст Уолтер
1
@HorstWalter Да, он должен работать с любым путем (я только что проверил некоторые, включая пробелы). Что вы подразумеваете под "цитируемым"? Вам не нужно использовать кавычки в путях, даже те, которые содержат пробелы. Если вы %np%содержите кавычки - да, это приведет к неправильному поведению.
wmz
2
@HorstWalter Смотрите мои изменения. Это проблема, только если вы используете переменные, использование литералов (как в echo %path%|findstr /i /c:"my path">nul || set path=%path%;"my path") должно работать нормально.
wmz
1
@wmz echo d\. | findstr /c:"d\."терпит неудачу, но echo d\. | find "d\."преуспевает
Восстановите Монику
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 ...

MaddHacker
источник
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
djangofan
источник