CMD: Додати до шляху, не дублюючи його?


12

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

Роблячи це в пакетному файлі, не враховується, чи вже включений користувацький шлях. Як я уникаю їх дублювання (тобто перевірити, чи він уже міститься в "рядку" PATH).

Зауваження:

  1. Пов'язано: Як додати визначені користувачем змінні середовища до системної змінної PATH в Windows 7?
  2. Пов'язане: Як я можу назавжди додати запис до змінної PATH системи за допомогою командного рядка?
  3. Те саме питання для UNIX: Додайте каталог до $ PATH, якщо його ще немає
  4. Деякі опції "CMD" String ops пояснили: 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%

Edit: змінений , findstr /i /c:щоб , find /iяк findstrможна перекрутити деякі послідовності , як було відзначено KubaOber в коментарях


Приємно, я знав, що є чистіший спосіб зробити це ... все ж віддаю перевагу баш, але це тільки я: 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

Сподіваюсь, що це допомагає, і я впевнений, що є простіший спосіб, але це повинно зробити трюк поки що.

EDIT

Тож якщо ви не хочете додавати інструменти 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'ed find, щоб працювати як підкоманда в операторі 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.