Установите постоянную переменную среды из cmd.exe
Мне нужно установить переменные среды на разных машинах Windows, но я не хочу, чтобы их вручную меняли, перейдя на экран свойств "Мой компьютер"
Я хочу сделать это из командной строки с помощью командного файла. Насколько я понимаю, использование set изменит только переменную для процессов, которые я вызову в окне команд.
Я хочу установить его определенно, поэтому позже, при запуске нового процесса, он будет использовать те новые настройки, которые я установил. Есть ли способ сделать это из командной строки?
Ответы
Ответ 1
Используйте команду SETX (обратите внимание на суффикс 'x'), чтобы установить переменные, которые сохраняются после закрытия окна cmd.
Например, чтобы установить env var "foo" со значением "bar":
setx foo bar
Хотя стоит прочитать "заметки", которые отображаются, если вы печатаете информацию об использовании (setx /?
), в частности:
2) В локальной системе переменные, созданные или измененные этим инструментом, будут доступны в будущих окнах команд, но не в текущем окне команд CMD.exe.
3) В удаленной системе переменные, созданные или измененные этим инструментом, будут доступны при следующем сеансе входа в систему.
В PowerShell команда [Environment] :: SetEnvironmentVariable.
Ответ 2
Документация MSDN для переменных среды сообщает вам, что делать:
Чтобы программно добавить или изменить переменные системной среды, добавьте их в раздел реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment, а затем передайте сообщение WM_SETTINGCHANGE с lParam, установленным в строку "Окружающая среда". Это позволяет приложениям, таким как оболочка, получать обновления.
Для этого вам, конечно, понадобятся права администратора. Я не знаю, как транслировать сообщение Windows из пакета Windows, поэтому вам нужно написать небольшую программу для этого.
Ответ 3
' 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
Ответ 4
Действительно, SET TEST_VARIABLE = значение работает только для текущего процесса, поэтому требуется SETX
. Быстрый пример постоянного хранения переменной среды на уровне пользователя.
- В cmd,
SETX TEST_VARIABLE etc
. Д. Еще не применено (echo %TEST_VARIABLE%
показывает %TEST_VARIABLE%
, - Быстрая проверка: открыть cmd,
echo %TEST_VARIABLE%
показывает и etc
- Проверка GUI: Системные свойства → Дополнительно → Переменные среды → Пользовательские переменные для → вы должны увидеть переменную TEST_VARIABLE со значением и
etc
. Д.
Ответ 5
:: 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'