Cmd.exe'den kalıcı bir ortam değişkeni ayarlayın


123

Ortam değişkenlerini farklı Windows makinelerinde ayarlamam gerekiyor, ancak "Bilgisayarım" ın özellikler ekranına girerek bunları manuel olarak değiştirmekten rahatsız olmak istemiyorum

Bunu bir toplu iş dosyasıyla komut satırından yapmak istiyorum. Anladığım kadarıyla set kullanmak sadece komut penceresinde çağıracağım işlemler için değişkeni değiştirecek.

Kesinlikle ayarlamak istiyorum, bu yüzden daha sonra yeni bir işlem çalıştırırken, belirlediğim yeni ayarları kullanacak. Bunu komut satırından yapmanın bir yolu var mı?


Kalıcı olacaklarsa onları komut satırından ayarlamanın ne anlamı var? Tekrar yapmana gerek kalmayacak.
canlı

12
Evet, ama bunu birkaç bilgisayarda yapmam gerekiyor, bu yüzden komut dosyasını çalıştırmak bana biraz zaman kazandıracak.
Arthur

2
Tamam, bu durumda, envanterinizi bir bilgisayara ayarlayabilir ve aşağıda açıklanan girişleri dışa aktarabilir ve SETX sizin için mevcut değilse bir .reg dosyasına sahip olabilirsiniz.
D-canlı

Ben de öyle yaptım. Teşekkürler.
Arthur

1
RE: 'Bunları komut satırından ayarlamanın amacı nedir ...' Çalıştığım yerde, yazılımın farklı sürümlerini test etmek / geliştirmek için bir dizi kalıcı çevresel değişkene farklı değerlere yönelik sürekli bir gereksinim vardır. Lisanslama, başka bir şekilde yapılamayacağı anlamına gelir (örneğin, bir VM çalıştırmak), bu nedenle, tek çaremiz SETX'i bir toplu komut dosyasında kullanmaktır. .Reg kullanmak, tam olarak neler olduğunu belgelemek / görmek daha zor olduğundan daha az iyidir
Tony Eastwood

Yanıtlar:


189

Cmd penceresi kapatıldıktan sonra da devam eden değişkenleri ayarlamak için SETX komutunu kullanın ('x' sonekine dikkat edin).

Örneğin, "bar" değerine sahip bir env var "foo" ayarlamak için:

setx foo bar

Kullanımı ( setx /?) yazdırırsanız görüntülenen 'notları' okumaya değer olsa da , özellikle:

2) Yerel bir sistemde, bu araç tarafından oluşturulan veya değiştirilen değişkenler gelecekteki komut pencerelerinde kullanılabilir olacak, ancak mevcut CMD.exe komut penceresinde bulunmayacaktır.

3) Uzak bir sistemde, bu araç tarafından oluşturulan veya değiştirilen değişkenler bir sonraki oturum açma oturumunda kullanılabilir olacaktır.

PowerShell'de, [Environment] :: SetEnvironmentVariable komutu.


Görünüşe göre SETX yalnızca Windows XP SP2'de mevcut
Arthur

2
Benim için Windows 7'de çalıştı. Windows'un hangi sürümünü kullanıyorsunuz?
Vik David

@jules: O zaman Kaynak Kitinden alabilirsiniz.
Joey

46
SETX'e dikkat edin, değişken uzunluğunuzu 1024 karaktere düşürür ...% path% 'i işlerken çok tehlikeli.
Etienne Desgagné

2
Güç Shell ile sadece olabilir [Environment]::SetEnvironmentVariable('PATH', "Whatever you need it to be", "Machine"), bkz msdn.microsoft.com/en-us/library/96xafkes(v=vs.110).aspx
Gradyan

21

Ortam değişkenleri için MSDN belgelerine ne yapmanız gerektiğini söyler:

Sistem ortam değişkenlerini programlı olarak eklemek veya değiştirmek için, bunları HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment kayıt defteri anahtarına ekleyin , ardından lParam "Environment" dizesine ayarlanmış bir WM_SETTINGCHANGE mesajı yayınlayın . Bu, kabuk gibi uygulamaların güncellemelerinizi almasına izin verir.

Bunu yapmak için elbette yönetici haklarına ihtiyacınız olacak. Windows toplu işleminden bir Windows mesajı yayınlamanın bir yolunu bilmiyorum, bu yüzden bunu yapmak için küçük bir program yazmanız gerekecek.


1
Tamam, çözümünüzü göz önünde bulundurarak, eklemek / değiştirmek istediğim ortam değişkenlerini içeren bir kayıt defteri (.reg) dosyası oluşturdum. Daha sonra bu dosyayı tüm hedef bilgisayarlarda çalıştıracağım. Etkilenecek uygulamayı yeniden başlatacağım için gerçekten bir Windows mesajı göndermeme gerek yok. Teşekkürler.
Arthur

1
Diğer cevabınızı buraya ekliyorum, çünkü bu soruya rastladığımda tam olarak aradığım şey buydu: stackoverflow.com/a/19705691/3543437
kayleeFrye_onDeck

1
@David, Peki neden setxaşağıya göre değil ?
Pacerier

Sanırım bu
reg'in

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
Kodunuza eşlik edecek bir bağlam veya açıklama eklemeyi düşünmelisiniz.
adamdunson

1
Güçlü kod parçası +1. XP olmadan setx(ve yükleme olasılığı olmadan) çalışır. Basit kullanım (benim durumumda):wsh.Environment("user").Item("myVar") = "my value"
Marek

2
XP'de kullanmak için (Kaynak Seti veya setx gerekmez), tüm (diğer) DOS pencerelerinde {set foo = bar} gerçekleştirmek için kimse sorun yaşamadığından: 1. Yukarıdaki kodu SetVar.vbs olarak kaydedin 2. setvar. vbs set system foo "bar" Not, geçerli DOS penceresi bundan FOO alamaz. Bunu başarmak için foo = bar sorunu ayarlayın
MicrosoftShouldBeKickedInNuts

2
Ayrıca, bu yeniden başlatma işleminden sonra da hayatta kalır (sistem parmağını kullandığınızda)
MicrosoftShouldBeKickedInNuts

1

Aslında SET TEST_VARIABLE = değer yalnızca mevcut işlem için çalışır, bu SETXnedenle gereklidir. Bir ortam değişkenini kullanıcı düzeyinde kalıcı olarak depolamak için hızlı bir örnek.

  1. Cmd olarak SETX TEST_VARIABLE etc. Henüz uygulanmadı ( echo %TEST_VARIABLE%gösterir %TEST_VARIABLE%,
  2. Hızlı kontrol: açık cmd, echo %TEST_VARIABLE%gösteriler etc.
  3. GUI kontrolü: Sistem Özellikleri -> Gelişmiş -> Ortam değişkenleri -> Kullanıcı değişkenleri -> değer ile Varible TEST_VARIABLE görmelisiniz 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'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.