Установите постоянную переменную среды из cmd.exe

123

Мне нужно установить переменные среды на разных компьютерах с Windows, но я не хочу, чтобы меня беспокоили их изменение вручную, открыв экран свойств «Мой компьютер».

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

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

Артур
источник
Какой смысл устанавливать их из командной строки, если они будут постоянными? Тебе не придется делать это снова.
d-live
12
Да, но мне приходится делать это на нескольких компьютерах, поэтому запуск сценария сэкономит мне время.
Артур
2
Хорошо, в этом случае вы можете установить свой env на одном компьютере и выполнить экспорт записей, описанных ниже, и получить файл .reg, если SETX вам недоступен.
d-live
Вот что я сделал. Спасибо.
Артур
1
RE: «Какой смысл устанавливать их из командной строки ...» Где я работаю, существует постоянное требование к ряду постоянных переменных среды с разными значениями, чтобы тестировать / разрабатывать разные версии программного обеспечения. Лицензирование означает, что это невозможно сделать каким-либо другим способом (например, при запуске виртуальной машины), поэтому наш единственный выход - использовать SETX в пакетном сценарии. Использование .reg менее удобно, поскольку его сложнее задокументировать / увидеть, что именно происходит,
Тони Иствуд

Ответы:

189

Используйте команду SETX (обратите внимание на суффикс «x»), чтобы установить переменные, которые сохраняются после закрытия окна cmd.

Например, чтобы установить переменную env "foo" со значением "bar":

setx foo bar

Хотя стоит прочитать «примечания», которые отображаются, если вы напечатаете usage ( setx /?), в частности:

2) В локальной системе переменные, созданные или измененные этим инструментом, будут доступны в будущих командных окнах, но не в текущем командном окне CMD.exe.

3) В удаленной системе переменные, созданные или измененные этим инструментом, будут доступны при следующем сеансе входа в систему.

В PowerShell команда [Environment] :: SetEnvironmentVariable .

Вик Давид
источник
Похоже, что SETX доступен только в Windows XP SP2
Артур
2
У меня это сработало на Windows 7. Какую версию Windows вы используете?
Вик Дэвид
@jules: Тогда вы можете получить его из набора ресурсов.
Джои
46
Будьте осторожны с SETX, он усекает вашу переменную длину до 1024 символов ... очень опасно при манипулировании% path%.
Etienne Desgagné
2
с Power Shell вы можете просто [Environment]::SetEnvironmentVariable('PATH', "Whatever you need it to be", "Machine")см. msdn.microsoft.com/en-us/library/96xafkes(v=vs.110).aspx
Gradient
21

В документации MSDN для переменных среды указано, что делать:

Чтобы программно добавить или изменить системные переменные среды, добавьте их в раздел реестра HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment , а затем передайте сообщение WM_SETTINGCHANGE с параметром lParam, установленным в строку «Environment». Это позволяет приложениям, таким как оболочка, получать ваши обновления.

Для этого вам, конечно же, потребуются права администратора. Я не знаю способа транслировать сообщение Windows из пакета Windows, поэтому вам нужно написать небольшую программу для этого.

Дэвид Хеффернан
источник
1
Итак, учитывая ваше решение, я создал файл реестра (.reg), содержащий переменные среды, которые я хочу добавить / изменить. Затем я запускаю этот файл на всех целевых компьютерах. Мне действительно не нужно отправлять сообщение Windows, так как я просто перезапущу приложение, которое будет затронуто. Спасибо.
Артур
1
Я добавляю ваш другой ответ сюда, так как это было именно то, что я искал, когда наткнулся на этот вопрос: stackoverflow.com/a/19705691/3543437
kayleeFrye_onDeck
1
@David, а почему не setxсогласно ниже?
Pacerier
Я думаю, что у этого регистра есть то преимущество, что он не усекает и не является
PowerShell
2
' SetVar.vbs
Sub sety(wsh, action, typey, vary, value)
  Dim wu
  Set wu = wsh.Environment(typey)
  wui = wu.Item(vary)
  Select Case action
    Case "ls"
      WScript.Echo wui
    Case "del"
      On Error Resume Next
      wu.remove(vary)
      On Error Goto 0
    Case "set"
      wu.Item(vary) = value
    Case "add"
      If wui = "" Then
        wu.Item(vary) = value
      ElseIf InStr(UCase(";" & wui & ";"), UCase(";" & value & ";")) = 0 Then
        wu.Item(vary) = value & ";" & wui
      End If
    Case Else
      WScript.Echo "Bad action"
  End Select
End Sub

Dim wsh, args
Set wsh = WScript.CreateObject("WScript.Shell")
Set args = WScript.Arguments
Select Case WScript.Arguments.Length
  Case 3
    value = ""
  Case 4
    value = args(3)
  Case Else
    WScript.Echo "Arguments - 0: ls,del,set,add; 1: user,system, 2: variable; 3: value"
    value = "```"
End Select
If Not value = "```" Then
  ' 0: ls,del,set,add; 1: user,system, 2: variable; 3: value
  sety wsh, args(0), args(1), UCase(args(2)), value
End If
Джастин Пил
источник
21
Вам следует подумать о добавлении некоторого контекста или объяснения для сопровождения вашего кода.
adamdunson
1
Мощный фрагмент кода +1. Работает на XP без setx(и без возможности его установки). Простое использование (в моем случае):wsh.Environment("user").Item("myVar") = "my value"
Марек
2
Поскольку никто не позаботился о том, чтобы использовать его в XP (не требуется Resource Kit или setx), чтобы выполнить {set foo = bar} для всех (других) окон DOS: 1. сохраните указанный выше код как SetVar.vbs 2. setvar. vbs set system foo "bar" Обратите внимание, текущее окно DOS не получает FOO из этого. Для этого необходимо установить foo = bar
MicrosoftShouldBeKickedInNuts,
2
Также обратите внимание, что это переживает перезагрузку (когда вы используете системные параметры)
MicrosoftShouldBeKickedInNuts
1

Действительно, значение SET TEST_VARIABLE = работает только для текущего процесса, поэтому SETXявляется обязательным. Быстрый пример постоянного хранения переменной среды на уровне пользователя.

  1. В ЦМД, SETX TEST_VARIABLE etc. Еще не применено ( echo %TEST_VARIABLE%показывает %TEST_VARIABLE%,
  2. Быстрая проверка: открываю cmd, echo %TEST_VARIABLE%показывает etc.
  3. Проверка графического интерфейса пользователя: Свойства системы -> Дополнительно -> Переменные среды -> Пользовательские переменные для -> вы должны увидеть переменную TEST_VARIABLE со значением etc.
Алексей
источник
0
:: Sets environment variables for both the current `cmd` window 
::   and/or other applications going forward.
:: I call this file keyz.cmd to be able to just type `keyz` at the prompt 
::   after changes because the word `keys` is already taken in Windows.

@echo off

:: set for the current window
set APCA_API_KEY_ID=key_id
set APCA_API_SECRET_KEY=secret_key
set APCA_API_BASE_URL=https://paper-api.alpaca.markets

:: setx also for other windows and processes going forward
setx APCA_API_KEY_ID     %APCA_API_KEY_ID%
setx APCA_API_SECRET_KEY %APCA_API_SECRET_KEY%
setx APCA_API_BASE_URL   %APCA_API_BASE_URL%

:: Displaying what was just set.
set apca

:: Or for copy/paste manually ...
:: setx APCA_API_KEY_ID     'key_id'
:: setx APCA_API_SECRET_KEY 'secret_key'
:: setx APCA_API_BASE_URL   'https://paper-api.alpaca.markets'
gseattle
источник