Как установить переменные среды для одной команды в Windows? [Дубликат]

21

Есть ли способ установить переменные среды для одной команды в Windows, как ENVVAR=abc commandв Unix?

Переменные, установленные setкомандой в Windows, похоже, остаются для следующих команд, но это не то, что я хочу.

谷口 昂 平
источник
Я думаю, что вам придется их отключить самостоятельно.
Зина

Ответы:

29

Есть ли способ установить переменные среды для одной команды?

Из текущей cmdоболочки:

Вы должны очистить переменную самостоятельно.

set ENVVAR=abc && dir & set ENVVAR=

Из пакетного файла:

Вы можете использовать setlocalи endlocal.

@echo off
setlocal 
  set ENVVAR=abc && dir
endlocal

Используйте дочернюю cmdоболочку:

Вы можете использовать cmd /cдля создания дочерней оболочки.

Переменная устанавливается в дочерней оболочке и не влияет на родительскую оболочку (как указано в комментарии jpmc26 ).

cmd /C "set ENVVAR=abc && dir"

Дальнейшее чтение

  • Индекс AZ командной строки Windows CMD - Отличный справочник по всем вопросам, связанным с командной строкой Windows.
  • cmd - Запустить новую оболочку CMD и (необязательно) запустить команду / исполняемую программу.
  • endlocal - завершить локализацию изменений среды в командном файле. Передача переменных из одного пакетного файла в другой.
  • перенаправление - операторы перенаправления.
  • set - отображать, устанавливать или удалять переменные окружения CMD. Изменения, сделанные с помощью SET, будут сохраняться только в течение текущего сеанса CMD.
  • setlocal - устанавливает параметры для управления видимостью переменных среды в пакетном файле.
ДэвидПостилл
источник
Другой вариант - запустить отдельный cmdпроцесс и установить их там. Например, cmd /C "set ENVVAR=abc && dir". Поскольку это не повлияет на родительский процесс, оно будет эффективно «очищено» при выходе.
jpmc26
@ jpmc26 Хорошо. Благодарю. Добавлено в ответ.
DavidPostill
Этот первый метод не очистит переменную, если команда потерпит неудачу.
никто не
@AndrewMedico Спасибо. Хорошая точка зрения. Ответ исправлен.
DavidPostill