Dodaj katalog i wszystkie podkatalogi do zmiennej PATH za pomocą jednego wpisu

19

W katalogu domowym mam katalog, w którym umieszczam oprogramowanie wiersza polecenia (CMD_Software). Umieszczam każde oprogramowanie we własnym katalogu w CMD_Software, aby uniknąć bałaganu.

Chciałbym wprowadzić pojedynczy wpis do mojej zmiennej PATH, który pozwoli na dostęp do CMD_Software i wszystkich zawartych w nim katalogów z wiersza poleceń.

Próbowałem, C:\Users\myuser\CMD_Software\*ale nic to nie dało. W tym momencie zabrakło mi pomysłów.

Pamiętaj, że nie próbuję ustawić nowej ścieżki w terminalu, próbuję ustawić nową ścieżkę w „Zmiennych środowiskowych” dostępnych na karcie „Zaawansowane” we Właściwościach systemu.

Landon Brainard
źródło
Czy próbowałeś czegoś takiego jak `C: \ Users \ myuser \ CMD_Software *`?
terdon
4
Nie sądzę, żeby to było możliwe.
Harry Johnston,

Odpowiedzi:

16

Zmienna PATH nie obsługuje symboli wieloznacznych ani rekurencji. To jest z założenia.

Istnieją dwa możliwe obejścia, których użyłem czasami:

  • Utwórz katalog z prostymi plikami wsadowymi i dodaj ten katalog do ŚCIEŻKI. Każdy plik wsadowy może uruchomić żądany program, na przykład:

    :: CMD_Software.bat: start CMD_Software
    @C:\Users\myuser\CMD_Software\CMD_Software.exe %*
    

    Pierwszy wiersz jest komentarzem, drugi zaczyna się od, @aby uniknąć wyświetlania uruchamianego polecenia, i %*służy do przekazywania argumentów wiersza polecenia do EXE.

  • Dodaj aliasy do CMD.EXE:

    DOSKEY CMD_Software="C:\Users\myuser\CMD_Software\CMD_Software.exe" $*
    

    Zasadniczo przekłada się to CMD_Softwarew wierszu polecenia na wszystko po znaku równości. $*Otrzymuje z dostarczonym argumentów.

Wolę drugie podejście, ponieważ możesz pogrupować wszystkie aliasy w jednym pliku (zobacz przełącznik „/ MACROFILE” w DOSKEY /?) I włączyć automatyczne uruchamianie za każdym razem, gdy interpreter poleceń zacznie korzystać z ustawienia rejestru (zobacz klucz „AutoRun” w CMD /?).

Wadą drugiej metody jest to, że aliasy działają tylko na początku wiersza poleceń. Może to stanowić problem, jeśli chcesz połączyć polecenia. Na przykład CLS & CMD_Softwarenie będzie działać, chyba że umieścisz alias w osobnym wierszu za pomocą nawiasów:

CLS & (
CMD_Software
)

Ilekroć staje się to problemem, wracam do podejścia do pliku wsadowego.

efotinis
źródło
Dzięki! Pierwsza metoda działa dla mnie naprawdę dobrze, głównie dlatego, że nie muszę bałaganić rejestru, gdy przesyłam dane między komputerami. Jest to również dość schludne i wygodne, ponieważ spędzasz tylko trochę więcej czasu, aby utworzyć plik nietoperza, gdy pojawi się wspomniane narzędzie.
cyqsimon
Niestety muszę tak szybko zredagować moje poprzednie oświadczenie. Napotkałem dziwne problemy ze skryptami, które losowo kończyły się w połowie wykonania po przyjęciu pierwszej metody. W szczególności wget dla Windows wydaje się lubić zabijać mój skrypt po zakończeniu pobierania. Ostatnie dwie godziny zmarnowałem boleśnie na rozwiązywanie problemów ze skryptem, ale w końcu próbowałem wrzucić wszystkie pliki ex do jednego katalogu głównego, a problemy po prostu zniknęły. Dlatego zdecydowanie zalecałbym ostrożność, zanim ktokolwiek skorzysta z tej metody.
cyqsimon
4

Właśnie tego używam do rozwiązania problemu. Skopiuj poniższy skrypt i zapisz go FIXPATH.BATw folderze dodanym do PATHzmiennej środowiskowej. Na przykład:

C: \ Users \ myuser \ CMD_Software \

Teraz, gdy chcesz uruchomić program z podfolderu, powiedz ...

C: \ Users \ myuser \ CMD_Software \ unixutils \ grep.exe
lub
C: \ Users \ myuser \ CMD_Software \ imagetools \ exiftool.exe

Uruchom fixpathnajpierw, a następnie wpisz polecenie (np. grepLub exiftool) w następujący sposób:

Microsoft Windows [wersja 6.3.9600]
(c) 2013 Microsoft Corporation. Wszelkie prawa zastrzeżone.

C: \ Users \ myuser> fixpath
C: \ Users \ myuser> exiftool


FIXPATH.BAT

setlocal EnableDelayedExpansion
cd / D% ~ dp0

dla / R %% d w (.) do (
    ustaw "dirs =! dirs!; %% d"
)

ścieżka =% ścieżka%! katalogi!
(endlocal
    ustaw „ret =% PATH%”
)
cmd / K "title [#] Naprawiono ścieżkę [#] && path% ret%"
zjazd / B

Dzięki odpowiedzi @ VonC

Vinayak
źródło
1

Umieść podkatalog „programlinks \” w ... ... CMD_Software (lub gdziekolwiek, właściwie) i wypełnij go symbolicznymi linkami lub dowiązaniami twardymi do każdego pliku wykonywalnego, do którego chcesz uzyskać dostęp. Wtedy wystarczy pojedynczy wpis w PATH dla ... \ programlinks.

kreemoweet
źródło
1
Główny problem polega na tym, że jeśli istnieją biblioteki, od których zależy plik wykonywalny, potencjalnie znajdujące się w tym samym katalogu co plik exe, nie zostaną one użyte. A przynajmniej tak dzieje się z moją próbą.
zero298
Wielka uwaga, @ zero298. Chociaż chciałbym, jeśli ktoś jest w 100% pewien i może potwierdzić, że to prawda, proszę o wtargnięcie. (Bo w przeciwnym razie ta metoda jest absolutnie najczystsza ze wszystkich).
Henrik
-1

Jeśli pomysł Cię nie zniechęca, możesz skopiować narzędzia wiersza polecenia do katalogu Windows \ System32. Następnie możesz je uruchomić z dowolnego katalogu, tak jak ping lub ipconfig.

edytuj
Po trochę majstrowania, JEST to możliwe. Musisz tylko użyć średników, aby oddzielić swoje katalogi. Załóżmy, że masz program w „folderze 1” i „folderze 2”. Napisz swoją ścieżkę w ten sposób:

c:\folder1\;c:\folder2\;c:\folder3\;    etc....

Następnie możesz wywołać program w dowolnym katalogu bezpośrednio z wiersza poleceń. AFAIK nie ma innego sposobu na zrobienie tego za pomocą pojedynczej linii.

Informacje dodatkowe: http://en.wikipedia.org/wiki/PATH_(variable)

Lee Harrison
źródło
1
To nie ma większego sensu. 1. Spowodowałoby to usunięcie wszelkiej poprzedniej zawartości zmiennej PATH . 2. Zmienna PATH zawiera tylko folder, a nie jego podkatalogi (pożądany wynik). 3. Wywołanie, program.batponieważ %PATH%\program.batjest mniej więcej przeciwieństwem tego, do czego przeznaczona jest PATH.
Dennis