CMD: Dołącz do ścieżki bez powielania?

12

Dla jednej CMDsesji mogę łatwo ustawić nową ścieżkę:SET PATH=%PATH%;"insert custom path here"

Robiąc to w pliku wsadowym, nie uwzględnia się, czy ścieżka niestandardowa jest już uwzględniona. Jak uniknąć powielania go (tzn. Sprawdź, czy jest już zawarty w „ciągu” ŚCIEŻKI).

Uwagi:

  1. Powiązane: Jak dołączyć zmienne środowiskowe zdefiniowane przez użytkownika do zmiennej systemowej PATH w systemie Windows 7?
  2. Powiązane: Jak mogę na stałe dodać wpis do zmiennej PATH systemu, za pomocą wiersza poleceń?
  3. To samo pytanie dla UNIX: Dodaj katalog do $ PATH, jeśli jeszcze go nie ma
  4. Wyjaśnienie niektórych ciągów znaków „CMD”: http://ss64.com/nt/syntax-replace.html
Horst Walter
źródło
Należy zauważyć, że w tym kontekście powielanie jest nieszkodliwe. Prawdopodobnie rozsądniej byłoby pozwolić na wystąpienie duplikacji, niż próbować go uniknąć i wprowadzić ryzyko fałszywie dodatniego wyniku.
Harry Johnston,

Odpowiedzi:

14

Podobne do odpowiedzi MaddHackers, tylko bardziej kompaktowe.
echo %path%|find /i "%np%">nul || set path=%path%;%np%

%np%to twoja nowa ścieżka, oczywiście możesz zamiast tego używać literałów. Co robi: echo %path%|find /i "%np%">nulprzeszukuje istniejącą ścieżkę w poszukiwaniu ciągu, odrzucając dane wyjściowe. ||oznacza wykonanie w przypadku niepowodzenia, więc oznacza: Wyszukaj ścieżkę do dodania ciągu, a jeśli nie zostanie znaleziony, dodaj go.

Edycja: Generalnie nie jest wymagane cytowanie ścieżek, nawet tych zawierających spacje, ale jeśli chcesz je cytować , ta wersja będzie działać ze ścieżkami podwójnie cytowanymi:
echo %path%|find /i "%np:"=%">nul || set path=%path%;%np%

Edycja: zmieniono findstr /i /c:na, find /iponieważ findstrmoże źle interpretować niektóre sekwencje, jak zauważył KubaOber w komentarzach

wmz
źródło
Fajnie, wiedziałem, że jest na to czystszy sposób ... nadal wolę bash, ale to tylko ja: D Dzięki za pomoc!
MaddHacker
Fajnie, ale czy to działa ze spacjami na ścieżce? Przetestowałem to na moich konkretnych ścieżkach, ta „cytowana i ze spacjami” zostaje ponownie dodana. Jeden cytowany, ale spacje wydają się nie działać.
Horst Walter
1
@HorstWalter Tak, powinien działać z dowolną ścieżką (właśnie sprawdziłem niektóre ze spacjami). Co rozumiesz przez „cytowany”? Nie musisz używać cudzysłowów w ścieżkach, nawet tych zawierających spacje. Jeśli %np%zawierasz cytaty - tak, spowoduje to nieprawidłowe zachowanie.
wmz
2
@HorstWalter Zobacz moją edycję. Jest to tylko problem, jeśli używasz zmiennej, użycie literałów (jak w echo %path%|findstr /i /c:"my path">nul || set path=%path%;"my path") powinno działać poprawnie.
wmz
1
@wmz echo d\. | findstr /c:"d\."kończy się niepowodzeniem, ale się echo d\. | find "d\."udaje
Monikę
4

Wiem, że jest brudny, ale to powinno działać:

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

gdzie %checkstr%jest ciągiem do sprawdzenia w ŚCIEŻCE i %newpath%jest nową ŚCIEŻKĄ dołączaną do bieżącej ŚCIEŻKI

Mam nadzieję, że to pomaga i jestem pewien, że istnieje łatwiejszy sposób, ale na razie powinno wystarczyć.

EDYTOWAĆ

Jeśli więc nie chcesz dodawać narzędzi systemu UNIX do systemu Windows, możesz wypróbować następującą składnię:

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

Ugh, nie ładniejszy, i można to zrobić w jednym wierszu, jeśli można znaleźć polecenie find potoku, aby działało jako podkomenda w instrukcji if ...

MaddHacker
źródło
2

Skrypt oparty na odpowiedzi „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
źródło