Tetapkan variabel lingkungan yang persisten dari cmd.exe


123

Saya harus mengatur variabel lingkungan pada mesin windows yang berbeda, tetapi saya tidak ingin repot mengubahnya secara manual dengan membuka layar properti "My Computer"

Saya ingin melakukannya dari baris perintah, dengan file batch. Sejauh yang saya mengerti, menggunakan set hanya akan mengubah variabel untuk proses yang akan saya panggil di jendela perintah.

Saya ingin mengaturnya dengan pasti, jadi nanti, ketika menjalankan proses baru, itu akan menggunakan pengaturan baru yang telah saya tetapkan. Apakah ada cara untuk melakukannya dari baris perintah?


Apa gunanya menyetelnya dari baris perintah jika akan permanen? Anda tidak perlu melakukannya lagi.
d-live

12
Ya, tetapi saya harus melakukannya di beberapa komputer, jadi menjalankan skrip akan menghemat waktu saya.
Arthur

2
Ok, dalam hal ini Anda dapat menyetel env Anda di satu komputer dan melakukan ekspor entri yang dijelaskan di bawah ini dan memiliki file .reg, jika SETX tidak tersedia untuk Anda.
d-live

Itulah yang telah saya lakukan. Terima kasih.
Arthur

1
RE: 'Apa gunanya mengaturnya dari baris perintah ...' Di mana saya bekerja, ada persyaratan konstan untuk sejumlah variabel lingkungan yang persisten ke nilai yang berbeda untuk menguji / mengembangkan versi perangkat lunak yang berbeda. Pemberian lisensi berarti tidak dapat dilakukan dengan cara lain (misalnya menjalankan VM) jadi satu-satunya pilihan kami adalah menggunakan SETX dalam skrip batch. Menggunakan .reg kurang bagus karena lebih sulit untuk mendokumentasikan / melihat dengan tepat apa yang terjadi
Tony Eastwood

Jawaban:


189

Gunakan perintah SETX (perhatikan akhiran 'x') untuk mengatur variabel yang tetap ada setelah jendela cmd ditutup.

Misalnya, untuk menyetel env var "foo" dengan nilai "bar":

setx foo bar

Meskipun ada baiknya membaca 'catatan' yang ditampilkan jika Anda mencetak penggunaan ( setx /?), khususnya:

2) Di sistem lokal, variabel yang dibuat atau dimodifikasi oleh alat ini akan tersedia di jendela perintah di masa mendatang, tetapi tidak di jendela perintah CMD.exe saat ini.

3) Pada sistem jarak jauh, variabel yang dibuat atau dimodifikasi oleh alat ini akan tersedia pada sesi logon berikutnya.

Di PowerShell, perintah [Environment] :: SetEnvironmentVariable .


Sepertinya SETX hanya tersedia di windows XP SP2
Arthur

2
Ini bekerja pada Windows 7 untuk saya. Versi Windows apa yang Anda gunakan?
Vik David

@jules: Kalau begitu, Anda bisa mendapatkannya dari Resource Kit.
Joey

46
Berhati-hatilah dengan SETX, ini akan memotong panjang variabel Anda menjadi 1024 karakter ... sangat berbahaya saat memanipulasi% path%.
Etienne Desgagné

2
dengan Power Shell Anda dapat [Environment]::SetEnvironmentVariable('PATH', "Whatever you need it to be", "Machine")melihat msdn.microsoft.com/en-us/library/96xafkes(v=vs.110).aspx
Gradient

21

The dokumentasi MSDN untuk variabel lingkungan memberitahu Anda apa yang harus dilakukan:

Untuk menambahkan atau mengubah variabel lingkungan sistem secara terprogram, tambahkan variabel tersebut ke kunci registri HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment , lalu siarkan pesan WM_SETTINGCHANGE dengan lParam yang disetel ke string "Lingkungan". Ini memungkinkan aplikasi, seperti shell, untuk mengambil pembaruan Anda.

Anda tentu saja memerlukan hak admin untuk melakukan ini. Saya tidak tahu cara untuk menyiarkan pesan windows dari batch Windows jadi Anda harus menulis program kecil untuk melakukan ini.


1
Ok, jadi mempertimbangkan solusi Anda, saya telah membuat file registri (.reg) yang berisi variabel lingkungan yang ingin saya tambahkan / ubah. Saya kemudian akan menjalankan file ini di semua PC target. Saya tidak terlalu perlu mengirim pesan windows, karena saya hanya akan memulai ulang aplikasi yang akan terkena dampak. Terima kasih.
Arthur

1
Saya menambahkan jawaban Anda yang lain di sini, karena persis seperti yang saya cari ketika saya menemukan pertanyaan ini: stackoverflow.com/a/19705691/3543437
kayleeFrye_onDeck

1
@ David, jadi kenapa tidak di setxbawah ini?
Pacerier

Saya pikir reg ini memiliki keuntungan karena tidak memotong dan tidak menjadi PowerShell
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
Anda harus mempertimbangkan untuk menambahkan beberapa konteks atau penjelasan untuk menyertai kode Anda.
adamdunson

1
Sepotong kode yang kuat +1. Bekerja di XP tanpa setx(dan tanpa kemungkinan untuk menginstalnya). Penggunaan sederhana (dalam kasus saya):wsh.Environment("user").Item("myVar") = "my value"
Marek

2
Karena tidak ada yang mengambil masalah, untuk digunakan di XP (tidak diperlukan Resource Kit atau setx), untuk menyelesaikan {set foo = bar} untuk semua jendela DOS (lainnya): 1. simpan kode di atas sebagai SetVar.vbs 2. setvar. vbs mengatur sistem foo "bar" Catatan, jendela DOS saat ini tidak mendapatkan FOO dari ini. Issue set foo = bar untuk mencapai itu
MicrosoftShouldBeKickedInNuts

2
Perhatikan juga, ini bertahan reboot (ketika Anda menggunakan sistem parm)
MicrosoftShouldBeKickedInNuts

1

Memang SET TEST_VARIABLE = nilai berfungsi hanya untuk proses saat ini, jadi SETXdiperlukan. Contoh cepat untuk menyimpan variabel lingkungan secara permanen di tingkat pengguna.

  1. Dalam cmd SETX TEST_VARIABLE etc,. Belum diterapkan ( echo %TEST_VARIABLE%acara %TEST_VARIABLE%,
  2. Pemeriksaan cepat: buka cmd, echo %TEST_VARIABLE%pertunjukkan etc.
  3. Pemeriksaan GUI: System Properties -> Advanced -> Environment variabel -> Variabel pengguna untuk -> Anda akan melihat Varible TEST_VARIABLE dengan nilai 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'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.