Встановити стійку змінну середовища від cmd.exe


123

Мені доводиться встановлювати змінні середовища на різних машинах Windows, але я не хочу заважати змінювати їх вручну, потрапляючи на екран властивостей "Мій комп'ютер"

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

Я хочу його встановити точно, тому пізніше, під час запуску нового процесу, він буде використовувати ті нові налаштування, які я встановив. Чи є спосіб зробити це з командного рядка?


Який сенс встановити їх з командного рядка, якщо вони будуть постійними? Вам не потрібно робити це знову.
d-live

12
Так, але я маю це робити на декількох комп'ютерах, тому запуск сценарію заощадить мені деякий час.
Артур

2
Гаразд, у такому випадку ви можете встановити env на одному комп’ютері та здійснити експорт записів, описаних нижче, та мати файл .reg, якщо SETX не доступний для вас.
d-live

Ось що я зробив. Дякую.
Артур

1
RE: "Який сенс встановлювати їх у командному рядку ..." Там, де я працюю, існує потреба в декількох стійких змінних середовищах до різних значень для тестування / розробки різних версій програмного забезпечення. Ліцензування означає, що це не може бути здійснено іншим способом (наприклад, запуск VM), тому єдиним нашим способом є використання SETX у пакетному сценарії. Використовувати .reg менш добре, оскільки складніше документувати / бачити, що саме відбувається
Тоні Іствуд

Відповіді:


189

Використовуйте команду SETX (зверніть увагу на суфікс 'x') для встановлення змінних, які зберігаються після закриття вікна cmd.

Наприклад, встановити env var "foo" зі значенням "bar":

setx foo bar

Хоча варто прочитати "примітки", які відображаються при друкуванні використання ( setx /?), зокрема:

2) У локальній системі змінні, створені або модифіковані цим інструментом, будуть доступні у майбутніх вікнах команд, але не у поточному вікні команд CMD.exe.

3) У віддаленій системі змінні, створені або модифіковані цим інструментом, будуть доступні на наступному сеансі входу.

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


Схоже, SETX доступний лише для Windows XP SP2
Артур

2
Він працював на Windows 7 для мене. Яку версію Windows ви використовуєте?
Вік Девід

@jules: Ви можете отримати його з Resource Kit.
Joey

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
Градієнт

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

Я думаю, що цей рег має перевагу в тому, що він не обрізається і не має права на власну оболонку
eri0o

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"
Marek

2
Оскільки ніхто не помилився, для використання на XP (не потрібен комплект ресурсів або setx), виконати {set foo = bar} для всіх (інших) вікон DOS: 1. збережіть вище коду як SetVar.vbs 2. setvar. vbs set system foo "bar" Примітка: поточне вікно DOS не отримує FOO від цього. Випуск встановлений foo = бар, щоб досягти цього
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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.