Добавить каталог и все подкаталоги в переменную PATH с помощью одной записи

19

В моей домашней папке есть каталог, в который я помещаю программное обеспечение командной строки (CMD_Software). Я помещаю каждую часть программного обеспечения в свой собственный каталог в CMD_Software, чтобы избежать беспорядка.

Я хотел бы сделать одну запись в моей переменной PATH, которая позволит получить доступ к CMD_Software и всем каталогам, которые он содержит, из командной строки.

Я пытался, C:\Users\myuser\CMD_Software\*но это ничего не сделало. В этот момент у меня кончились идеи.

Обратите внимание, что я не пытаюсь установить новый путь в терминале, я пытаюсь установить новый путь в «Переменных среды», доступных на вкладке «Дополнительно» в свойствах системы.

Лэндон Брейнард
источник
Вы пробовали что-то вроде `C: \ Users \ myuser \ CMD_Software *`?
Terdon
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 /?) И запускать его автоматически всякий раз, когда интерпретатор команд начинает использовать параметр реестра (см. Ключ «AutoRun» в CMD /?).

Недостаток второго метода заключается в том, что псевдонимы работают только в начале командной строки. Это может быть проблемой, если вы хотите объединить команды. Например, CLS & CMD_Softwareне будет работать, если вы не поместите псевдоним в отдельной строке, используя скобки:

CLS & (
CMD_Software
)

Всякий раз, когда это становится проблемой, я просто возвращаюсь к подходу пакетного файла.

efotinis
источник
Благодарность! Первый метод работает очень хорошо для меня, в основном потому, что мне не нужно связываться с реестром при передаче данных между компьютерами. Это также довольно аккуратно и удобно, поскольку вы тратите чуть-чуть больше времени на создание файла bat, когда получаете указанную утилиту.
Cyqsimon
К сожалению, я должен быстро отредактировать свое предыдущее утверждение. Я столкнулся со странными проблемами со сценариями, случайно выходящими из середины выполнения после принятия первого метода. В частности, кажется, что wget для Windows убивает мой скрипт после того, как он завершил загрузку. Последние два часа я тратил на устранение проблем, связанных со скриптом, но в итоге попытался выбросить все файлы exes в один корневой каталог, и проблемы просто исчезли. Поэтому я настоятельно рекомендую осторожность, прежде чем кто-либо пойдет в олл-ин с этим методом.
Cyqsimon
4

Это то, что я использую для решения проблемы. Скопируйте этот скрипт ниже и сохраните его как FIXPATH.BATв папку, которую вы добавили в PATHпеременную окружения. Например:

C: \ Users \ MyUser \ CMD_Software \

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

C: \ Users \ MyUser \ CMD_Software \ unixutils \ grep.exe
или
C: \ Users \ MyUser \ CMD_Software \ imagetools \ exiftool.exe

fixpathСначала запустите, а затем введите команду (например, grepили exiftool) следующим образом:

Microsoft Windows [Версия 6.3.9600]
(c) Корпорация Майкрософт, 2013 год. Все права защищены.

C: \ Users \ MyUser> fixpath
C: \ Users \ MyUser> ExifTool


FIXPATH.BAT

setlocal EnableDelayedExpansion
кд / д% ~ дп0

for / R %% d in (.) do (
    установите "dirs =! dirs!; %% d"
)

путь =% путь%! каталоги!
(Endlocal
    установить "ret =% PATH%"
)
cmd / K "title [#] Путь исправлен [#] && path% ret%"
выход / B

Благодаря ответу @ VonC

Винаяк
источник
1

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

kreemoweet
источник
1
Основная проблема заключается в том, что если есть какие-либо библиотеки, от которых зависит исполняемый файл, которые могут находиться в том же каталоге, что и исполняемый файл, они не будут использоваться. Или, по крайней мере, так происходит с моей попыткой сделать это.
ноль298
Замечательное замечание, @ zero298. Хотя я хотел бы, если кто-то на 100% уверен и может подтвердить, что это действительно так, пожалуйста, включите. (В противном случае этот метод является абсолютно чистым из всех.)
Хенрик
-1

Если вы не слишком расстроены этой идеей, вы можете скопировать инструменты командной строки в каталог Windows \ System32. Затем вы можете запустить их из любого каталога, например, ping или ipconfig.

править
После немного мастерить вокруг, это возможно. Вам просто нужно использовать точки с запятой для разграничения ваших каталогов. Скажем, у вас была программа в «folder1» и «folder2». Вы бы написали свой путь так:

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.
Деннис