Додайте каталог та всі підкаталоги до змінної PATH за допомогою одного запису


19

У мене в домашній папці є каталог, в який я розміщую програмне забезпечення командного рядка (CMD_Software). Я поміщаю кожен фрагмент програмного забезпечення у свій каталог у межах CMD_Software, щоб уникнути неполадок.

Я хотів би зробити єдиний запис у своїй змінній PATH, який дозволить отримати доступ до CMD_Software та всіх каталогів, які він містить, з командного рядка.

Я намагався, C:\Users\myuser\CMD_Software\*але це нічого не робило. Це той момент, коли мені не вистачало ідей.

Зауважте, що я не намагаюся встановити новий шлях, перебуваючи в терміналі, я намагаюся встановити новий шлях у "Змінні середовища", доступному на вкладці "Додатково" Властивості системи.


Ви спробували щось на зразок `C: \ Users \ myuser \ CMD_Software *`?
тердон

4
Я не думаю, що це можливо.
Гаррі Джонстон

Відповіді:


16

Змінна PATH не підтримує підстановку чи рекурсію. Це за дизайном.

Є два можливі вирішення, які я використовував при нагоді:

  • Створіть каталог з простими пакетними файлами та додайте цей каталог у PATH. Кожен пакетний файл може запустити потрібну програму, наприклад:

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

    Перший рядок - це коментар, другий починається з того, @щоб уникнути показу виконуваної команди, і %*використовується для передачі будь-яких аргументів командного рядка EXE.

  • Додайте псевдоніми до CMD.EXE:

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

    Це по суті переводить CMD_Softwareу командному рядку все після знака рівності. Аргумент $*замінено на додані аргументи.

Я віддаю перевагу другому підходу, тому що ви можете згрупувати всі псевдоніми в одному файлі (див. Перемикач "/ MACROFILE" в DOSKEY /?) І мати його автозапуск, коли інтерпретатор команд починає використовувати налаштування реєстру (див. Клавішу "Автозапуск" в CMD /?).

Недоліком другого методу є те, що псевдоніми працюють лише на початку командного рядка. Це може бути проблемою, якщо ви хочете ланцюжок команд. Наприклад, CLS & CMD_Softwareне буде працювати, якщо ви не поставите псевдонім в окремий рядок за допомогою дужок:

CLS & (
CMD_Software
)

Щоразу, коли це стає проблемою, я просто відступаю від підходу до пакетного файлу.


Спасибі! Перший метод для мене працює дуже добре, головним чином тому, що мені не доводиться возитися з реєстром, коли я передаю свої дані між комп'ютерами. Це також досить охайно і зручно, оскільки вам потрібно витратити трохи більше часу, щоб створити файл bat, коли ви отримаєте зазначену утиліту.
cyqsimon

На жаль, я повинен швидко відредагувати свою попередню заяву. У мене виникли дивні проблеми зі сценаріями, що випадковим чином виходять на половину шляху виконання після прийняття першого методу. Зокрема, wget для Windows, як видається, насолоджується вбивством мого сценарію після його завантаження. Останні дві години я даремно болісно виправляв свій сценарій, але врешті-решт я спробував перекинути всі exe в єдиний кореневий каталог, і проблеми просто зникли. Тому я б наполегливо радив бути обережним, перш ніж хтось впорається з цим методом.
cyqsimon

4

Це те, що я використовую для вирішення проблеми. Скопіюйте цей скрипт нижче та збережіть його як FIXPATH.BATу папку, яку ви додали до PATHзмінної середовища. Наприклад:

C: \ Користувачі \ myuser \ CMD_Software \

Тепер, коли вам потрібно запустити програму, яка знаходиться у підпапці, скажіть ...

C: \ Users \ myuser \ CMD_Software \ unixutils \ grep.exe
або
C: \ користувачів \ myuser \ CMD_Software \ imagetools \ exiftool.exe

Запустіть fixpathспочатку, а потім введіть команду (наприклад, grepабо exiftool):

Microsoft Windows [Версія 6.3.9600]
(c) Корпорація Microsoft 2013 року. Всі права захищені.

C: \ Users \ myuser> fixpath
C: \ Користувачі \ myuser> exiftool


FIXPATH.BAT

setlocal EnableDelayedExpansion
cd / D% ~ dp0

для / R %% d у (.) do (
    встановити "dirs =! dirs!; %% d"
)

шлях =% шлях%! dirs!
(ендолокальний
    встановити "ret =% PATH%"
)
cmd / K "title [#] Fixed path [#] && path% ret%"
вихід / В

Завдяки відповіді @ VonC


1

Помістіть підкаталог "programlinks \" під ... \ CMD_Software (або де-небудь фактично) і заповніть його символічними посиланнями або жорсткими посиланнями до кожного виконуваного файлу, до якого ви хочете отримати доступ. Тоді одного запису в PATH для ... \ programlinks буде достатньо.


1
Основна проблема з цим полягає в тому, що якщо є якісь бібліотеки, від яких залежить виконаний файл, розташований потенційно в тому ж каталозі, що і exe, вони не будуть використовуватися. Або принаймні ось що відбувається з моєю спробою з цим.
нуль298

Чудове зауваження, @ zero298. Хоча я хотів би, якщо хтось на 100% впевнений і може підтвердити, що це насправді, будь ласка, передзвоніть. (Тому що цей спосіб інакше абсолютно чистий від усіх.)
Генрік

-1

Якщо ви не надто відкладені ідеєю, можете скопіювати інструменти командного рядка в каталог Windows \ System32. Тоді ви можете запустити їх з будь-якого каталогу, як-от ping або ipconfig.

редагувати
Після трохи роздумувати це можливо. Вам просто потрібно використовувати крапки з комою для розмежування каталогів. Скажіть, у вас була програма в "папці1" та "папці2". Ви напишете свій шлях так:

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

Потім ви можете викликати програму в будь-якому каталозі прямо з командного рядка. AFAIK немає іншого способу зробити це лише одним рядком.

Інформація про підтримку: http://en.wikipedia.org/wiki/PATH_(variable)


1
Це не має великого сенсу. 1. Це видалить будь-який попередній вміст змінної PATH . 2. Змінна PATH містила б лише папку, а не її підкаталоги (бажаний результат). 3. Викликати так program.batсамо, %PATH%\program.batяк більш-менш протилежне тому, для чого призначений PATH.
Денніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.