Командная строка - Как добавить заданный путь только для выполнения этого пакетного файла?


187

По сути, я знаю, что могу пройти через панель управления и изменить переменную пути. Но мне интересно, есть ли способ через пакетное программирование включить временный путь? Таким образом, он используется только во время выполнения этого пакетного файла. Я не хочу, чтобы люди заходили и изменяли свои переменные пути только для того, чтобы использовать мой командный файл.

Ответы:


318

Как и любая другая переменная окружения, с SET:

SET PATH=%PATH%;c:\whatever\else

Если вы хотите, чтобы сначала была встроена небольшая проверка безопасности, проверьте, существует ли сначала новый путь:

IF EXIST c:\whatever\else SET PATH=%PATH%;c:\whatever\else

Если вы хотите, чтобы это было локально для этого пакетного файла, используйте setlocal:

setlocal
set PATH=...
set OTHERTHING=...

@REM Rest of your script

Внимательно прочитайте документы для setlocal/ endlocalи взгляните на другие ссылки на этом сайте - функции тоже довольно интересные, а синтаксис хитрый.

Синтаксис страница должна вам начать с основ.


3
Если вы добавите a setlocalв свой пакетный файл, путь будет виден только в файле
jeb

Как вы добавляете "setlocal"? Это вместо "SET"?
Майкл

@micheal: обновил мой ответ ссылками. Пожалуйста, прочитайте некоторые документы / примеры / учебные пособия о сценариях cmd - SETэто действительно то, что вы должны знать и понимать, прежде чем выполнять какие-либо сценарии.
Мат

2
Спасатель жизни. Мне нужно было добавить EV на сервер, который не может быть перезапущен, и это позволяет мне делать то, что мне нужно, не планируя перезапуск!
dav_i

8
Даже без SETLOCALэтого, в большинстве случаев, это будет только для этого отдельного сеанса командной строки - если вы делаете это из более чем одного пакетного файла и используете EXIT /B %N%, тогда, SETLOCALв основном, вы просто сбросите свои изменения при выходе из сценария. : - /
BrainSlugs83

21

Есть важная деталь:

set PATH="C:\linutils;C:\wingit\bin;%PATH%"

не работает, пока

set PATH=C:\linutils;C:\wingit\bin;%PATH%

работает. Разница в кавычках!

UPD также см. Комментарий от Venimus


3
на самом деле это должны быть SET "PATH=...%PATH%"пробелы, существующие в пути, что приведет к ошибкам или неправильному поведению. Заключение в такие кавычки не будет включать их, но будет правильно устанавливать переменную. То же самое работает для любой другой переменной env.
Venimus

20

Это верно, но это не меняет это постоянно, но только для текущей командной строки, если вы хотите изменить это постоянно, вы должны использовать, например, это:

setx ENV_VAR_NAME "DESIRED_PATH" /m

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


Может быть, /mдолжно быть после setx?
Suzanshakya

У меня работает то же самое, но этот Win Batch Scripting - небольшой незаконченный бизнес от MS. В моей компании, где у нас все одинаковые ноутбуки с одной и той же системой, не существует универсального сценария для настройки PATH, и мы поддерживаем 2 или 3 из них, поэтому все, что вам
подходит

Спасибо за обновление. В Windows Server 2012, когда я ставил /mв конце, DESIRED_PATHбыл добавлен с / m в конце только для текущего пользователя.
Suzanshakya

11
Слово предостережения. Используя setx на пути, пытаясь добавить к нему больше, и длина строки> 1024, я обнаружил, что результат (моя среда PATH) был обрезан навсегда. (Хорошо, что у меня была возможность скопировать% PATH%, который был у меня в ECHOed до изменения, и вернуть его обратно с помощью инструмента Windows «Переменные среды».)
Андреас Янссон

Внимание! Эта команда напрямую перезаписывает системную переменную среды! Я удалил их и пытаюсь их исправить. А также для тех, кто сделал эту ошибку: не перезагружайте компьютер. Напишите, echo %path%и вы получите текущий загруженный путь. Вам необходимо отличать переменные среды пользователя и системы друг от друга. Затем вы можете вручную применить их в нужном месте.
Alper
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.