İşletim sistemi düzeyi yapılandırmasından bir ortam değişkenini kaldırmak için komut satırı


182

Windows şu setxkomutu taşır:

Description:
    Creates or modifies environment variables in the user or system
    environment.

Böylece şöyle bir değişken ayarlayabilirsiniz:

setx FOOBAR 1

Ve değeri şu şekilde silebilirsiniz:

setx FOOBAR ""

Ancak, değişken kaldırılmaz. Kayıt defterinde kalır:

filanca

Peki değişkeni gerçekte nasıl kaldırırsınız?


3
setx sadece değişkeni ayarlar. Sadece bu çizgiyle kesiyorsun.
Fox Wilson


Oldukça fazla kazmam gerektiğinden, komut dışı satır seçenekleri için superuser.com/q/297947/46834 adresine bakın .
gary

Yanıtlar:


217

Değişkeni geçerli ortamdan kaldırmak için ( kalıcı olarak değil ):

set FOOBAR=

Değişkeni kullanıcı ortamından kalıcı olarak kaldırmak için (varsayılan yer setxkoyar):

REG delete HKCU\Environment /F /V FOOBAR

Değişken sistem ortamında ayarlanmışsa (örneğin başlangıçta ile ayarladıysanız setx /M), yönetici olarak çalıştırın:

REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR

Not: Yukarıdaki REGkomutlar mevcut işlemleri (ve mevcut süreçlerden çatallanan bazı yeni işlemleri) etkilemez, bu nedenle değişikliğin hemen yürürlüğe girmesi önemliyse, yapılacak en kolay ve en güvenli şey oturumu kapatıp yeniden girmektir. veya yeniden başlatın. Bu bir seçenek değilse veya daha derine inmek istiyorsanız, buradaki diğer cevaplardan bazılarının kullanım durumunuza uygun olabilecek bazı harika önerileri vardır.


1
Bu çözüm işe yaramıyor gibi görünüyor - ya da temel bir şeyi yanlış anlıyorum. Ben yaparım setx JUNK Hello. Yeni cmd açın. Yazın echo %JUNK%ve alın Hello. Sonra yaparım REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V JUNKve değeri kayıt defterinden gittiğini onaylayın. Yeni cmd açıp yazıyorum echo %JUNK%ve hala alıyorum Hello. Kayıt defteri araması 'JUNK' olmadığını gösterir. Lütfen bana yeniden başlatmaya ihtiyacın olduğunu söyleme!
caasjj

Cevap için teşekkürler. Başlat menüsünden yeni bir komut penceresi açıyorum. Komutun her iki versiyonunu da denedim. Aslında, userortam komutunu ilk kez yazdığım zaman başarılı olur. Sonra, komutu yeniden yazdığımda alıyorum The system was unable to find the specified registry or key value. Ayrıca, JUNKkayıt defterinde küresel bir arama ile regedithiçbir şey ortaya çıkmaz. Yine de, yeni bir Komut penceresi açtığımda (Başlat / aksesuarlar veya Çalıştır'da cmd.exe aracılığıyla) ve yazdığımda echo %JUNK%değer hala orada!
caasjj

1
Ah! Bunun için rasyonel olan nedir? UNIX / BSD / Linux yetiştirme - her zaman yöneticiden mümkün olduğunca kaçınırım. Harika gayret için bir mil teşekkürler. +1
caasjj

4
belki sadece anlambilimseldir, ancak silme işlemi (kayıt defterinden) hemen yürürlüğe girer. Yeniden oturum açana kadar ortam kayıt defterinden yeniden başlatılmaz. Geçerli komuttan kaldırmak için 2 komutu birleştirebilirsiniz ( SETsonraki cmd kabuğu için listeden kaldıracak) ve daha sonra kayıt defterinden kaldırabilirsiniz, örneğin:SETX FOOBAR "" & REG delete HKCU\Environment /F /V FOOBAR
Luke

1
Yeniden başlatmadan ortamın güncellenmiş görünmemesinin nedeni explorer.exe dosyasının güncellendiğini bilmemesidir. Tam açıklama ve çözüm için cevabıma bakın.
Jamie

72

Değişkeni geçerli komut oturumundan kalıcı olarak kaldırmadan kaldırmak için, normal yerleşik setkomutu kullanın - sadece eşittir işaretinden sonra hiçbir şey koymayın:

set FOOBAR=

Onaylamak için setbağımsız değişken olmadan çalıştırın ve geçerli ortamı kontrol edin. Değişken listeden tamamen eksik olmalıdır.

Not : Bu yalnızca değişkeni geçerli ortamdan kaldırır - kayıt defterinde yapılan değişikliklere devam etmez. Yeni bir komut işlemi başlatıldığında değişken geri döner.


77
Bu kesinlikle cevap DEĞİLDİR ve çok fazla oy aldığını rahatsız edici buluyorum. Bu yalnızca geçerli komut oturumu için etkilidir. Yeni bir komut penceresi açın ve var geri döndü.
joescii

6
@joescii Bunu şaşırtıcı buluyor musunuz? Bu soru başlığında soruyu yanıtladı. Açıkçası soru başlığının daha spesifik olması gerekiyordu.
oberlies

10
@oberlies Başlıkta soruyu cevapladığına katılmıyorum, çünkü bu işletim sistemi düzeyinde DEĞİL, sadece geçerli komut penceresinde çalışmıyor. İkincisi, amacınız sorunun ayrıntılar kısmının alakasız olduğunu göstermektedir.
joescii

3
@oberlies ne yazık ki düzenleme hile yapmış gibi görünmüyor - hala oy alıyor. Sanırım insanlar asıl soruya cevap vermese bile yararlı buluyorlar, bu durumda belki de oyları hak ediyor (öyle mi?). En azından kabul edilebilir olarak işaretlenmedi, bu da yanıltıcı olurdu.
CupawnTae

3
Neden reddedildiğimi yorumlamam gerekiyor. Açıkçası bu sadece mevcut oturumda çalışıyor çünkü.
Ian Grainger

22

Bu biraz ele alındı, ancak eksik olan önemli bir bilgi parçası var. Umarım, bunun nasıl çalıştığını temizlemeye ve yorgun gezginlere biraz rahatlama sağlamaya yardımcı olabilirim. :-)

Geçerli İşlemden Sil

Açıkçası, herkes bunu geçerli işleminizden bir ortam değişkenini silmek için yaptığınızı bilir:

set FOO=

Kalıcı Silme

Sistem genelinde ve kullanıcı olmak üzere iki ortam değişkeni kümesi vardır.

Kullanıcı Ortamı Değişkenini Sil:

reg delete "HKCU\Environment" /v FOO /f

Sistem Genelindeki Ortam Değişkenini Sil:

REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOO

Yeniden Başlatmadan Değer Uygula

İşte eksik olan sihirli bilgi! Bunu yaptıktan sonra neden yeni bir komut penceresi başlattığınızda, ortam değişkeni hala orada olduğunu merak ediyorsunuz. Bunun nedeni, explorer.exe dosyasının ortamını güncellememesidir. Bir süreç diğerini başlattığında, yeni süreç ortamı başlatan işlemden devralır.

Yeniden başlatmadan bunu düzeltmenin iki yolu vardır. En kaba kuvvet yolu explorer.exe işleminizi öldürmek ve yeniden başlatmaktır. Bunu Görev Yöneticisi'nden yapabilirsiniz . Ancak bu yöntemi önermiyorum.

Diğer yol, explorer.exe'ye ortamın değiştiğini ve ortamın yeniden okunması gerektiğini bildirmektir. Bu, bir Windows mesajı (WM_SETTINGCHANGE) yayınlayarak yapılır. Bu, basit bir PowerShell betiği ile gerçekleştirilebilir. Bunu yapmak için kolayca bir tane yazabilirsiniz, ancak Komut Dosyası Değişikliklerinden Sonra Pencere Ayarlarını Güncelle'de bir tane buldum :

if (-not ("win32.nativemethods" -as [type])) {
    add-type -Namespace Win32 -Name NativeMethods -MemberDefinition @"
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessageTimeout(
            IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
            uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
        "@
}

$HWND_BROADCAST = [intptr]0xffff;
$WM_SETTINGCHANGE = 0x1a;
$result = [uintptr]::zero

[win32.nativemethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE,[uintptr]::Zero, "Environment", 2, 5000, [ref]$result);

özet

"FOO" adlı bir kullanıcı ortam değişkenini silmek ve değişikliğin daha sonra başlattığınız işlemlere yansımasını sağlamak için aşağıdakileri yapın.

  1. PowerShell betiğini bir dosyaya kaydedin (buna updateenv.ps1 adını vereceğiz).
  2. Bunu komut satırından yapın: reg delete "HKCU \ Environment" / v FOO / f
  3. Updateenv.ps1 komutunu çalıştırın.
  4. Komut isteminizi kapatıp yeniden açın; ortam değişkeninin artık tanımlanmadığını görürsünüz.

Bu komut dosyasını çalıştırmanıza izin vermek için muhtemelen PowerShell ayarlarınızı güncellemeniz gerekeceğini, ancak bunu sizin için bir Google-fu alıştırması olarak bırakacağım.


Gezgini öldürmeyi ve yeniden başlatmayı önermemenizin özel bir nedeni var mı? Onu her zaman yaparım.
Prometheus

Akla ilk gelen iki tane var. Birincisi, zorla öldürme işlemlerinin bellek sızıntılarına neden olabilmesidir. Evet, işlemlerin kum kutuları olması gerekiyordu, ancak Windows Görev Yöneticisi bile bunu hafifçe yapmamanız konusunda sizi uyarıyor. Diğer kişisel neden OKB'm. Explorer'ı öldürüp yeniden başlattığınızda, görev çubuğundaki tüm simgeler, bunlara tıkladığınızda kopyalar da dahil olmak üzere yeniden düzenlenir. Simgelerimin bir şeyleri açtığım sırada kalmasını istiyorum.
Jamie

1
Vay. Aradığım sihirli komut source .bashrc, Windows'taki (veya kuzenleri) gibi davranıyor . Bu benim için "buna başvur" satırının en üstüne gider.
19:22

18

Gönderen PowerShell .NET kullanabilirsiniz [System.Environment]::SetEnvironmentVariable()yöntemi:

  • İçin bir kaldırma kullanıcı ortam değişkeni adlı FOO:

    [Environment]::SetEnvironmentVariable('FOO', $null, 'User')
    

Değişkeni kaldırma$null amacını daha iyi belirtmek için kullanıldığına dikkat edin, ancak teknik olarak bu durumda geçmekle aynıdır .''

  • To a kaldırmak sistemi (makine düzeyi) ortam değişkeni adında FOO- yükseltme gerektiriyor (yönetici olarak çalıştırılmalıdır):

    [Environment]::SetEnvironmentVariable('FOO', $null, 'Machine')
    

Daha hızlı yürütmenin yanı sıra, reg.exetemelli yönteme göre avantaj , diğer uygulamaların bir WM_SETTINGCHANGEmesajla değişiklikten haberdar edilmesidir (ancak tüm uygulamalar bu mesajı dinlemez).


2
Buradaki en iyi cevap bu.
James

1
Bu yöntem, yeniden başlatma ihtiyacını ortadan kaldırır. Ne kadar zarif bir çözüm!
jyao

13

CupawnTae'a katılıyorum .

SET ana ortamdaki değişiklikler için yararlı değildir.

FYI: Sistem değişkenleri HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment(kullanıcı değişkenlerinden çok daha uzun).

Bu nedenle FOOBAR adlı bir sistem değişkeninin tam komutu şöyledir:

REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR

(Alanı işlemek için gereken tırnaklara dikkat edin.)

setxKomut silme sözdizimini desteklemiyorsa çok kötü . :(

Not: Sorumlu kullanın - Yol değişkeninizi öldürürseniz, beni suçlamayın!


Orijinal soruda açıkça belirtilen @CMCDragonkai - kayıt defteri girdisini kaldırmaz, sadece boş bırakır. Gerçek soru, kayıt defterinden nasıl kaldırılacağıdır
CupawnTae

1
Bu etkili olmadan önce cmd'yi yeniden başlatmanız / yenilemeniz gerekebilir.
jiggunjer

@jiggunjer, Nasıl yenilenir?
Pacerier

@ Pacer sadece yeni bir terminal açar.
jiggunjer

11

DougWare'in cevabındaki komut işe yaramadı, ancak bu işe yaradı:

reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v FOOBAR /f

Kısayol HKLMiçin kullanılabilir HKEY_LOCAL_MACHINE.


1
Ayrıca, kullanıcı ortam değişkenleri "HKCU \ Çevre"
altındadır

1
@Tzrlk, Uyuşmazlığın nedeni nedir? Neden orada HKLM \ Çevre değil?
Pacerier

@Pacerier: Onları neden tamamen ayrı konumlara yerleştirdiklerine dair hiçbir fikrim yok, ancak / hem sistem hem de kullanıcı değişkenlerini kaldırdığınızdan emin olmak istiyorsanız, bunların tamamen farklı olduklarını bilmek yardımcı olur yerler.
tzrlk

2
@Tzrlk, Windows tarafında yine vidalı bir tasarım olmalı.
Pacerier

4

Yeniden Başlatmadan Sil

OP'nin sorusu, powershell, vbscript veya yeniden adlandırmayla yeniden başlatmanın nasıl önleneceği de dahil olmak üzere gerçekten kapsamlı bir şekilde cevaplandı.

Ancak, yalnızca cmd komutlarına bağlı kalmanız gerekiyorsa ve powershell veya vbscript'i çağırabilme lüksüne sahip değilseniz, aşağıdaki yaklaşımı kullanabilirsiniz:

rem remove from current cmd instance
  SET FOOBAR=
rem remove from the registry if it's a user variable
  REG delete HKCU\Environment /F /V FOOBAR
rem remove from the registry if it's a system variable
  REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V FOOBAR
rem tell Explorer.exe to reload the environment from the registry
  SETX DUMMY ""
rem remove the dummy
  REG delete HKCU\Environment /F /V DUMMY

Buradaki sihir, ihtiyacınız olmayan bir değişkene (benim örneğimde DUMMY) bir şey atamak için "setx" kullanarak, Explorer.exe'yi powershell'e gerek duymadan kayıt defterinden yeniden okumaya zorlamanızdır. Daha sonra bu kukla temizlersiniz ve Explorer'ın ortamında bir süre daha kalacak olsa da, muhtemelen kimseye zarar vermez.

Veya değişkenleri sildikten sonra yenilerini ayarlamanız gerekiyorsa, herhangi bir kuklaya bile ihtiyacınız yoktur. Yeni değişkenleri ayarlamak için sadece SETX kullanıldığında, başlatılabilecek herhangi bir yeni cmd görevinden yeni kaldırdığınız değişkenler otomatik olarak silinecektir.

Arka plan bilgileri: Bu yaklaşımı, mevcut bir cmd komut dosyasını değiştirerek, işimdeki tüm bilgisayarlarda aynı ada sahip sistem değişkenleriyle bir dizi kullanıcı değişkenini değiştirmek için başarıyla kullandım. Elle yapmak için çok fazla bilgisayar yok veya fazladan powershell veya vbscripts'i hepsine kopyalamak pratik değildi. Kullanıcıyı sistem değişkenleriyle değiştirmek için acilen ihtiyaç duymamın nedeni, kullanıcı değişkenlerinin dolaşım profillerinde senkronize edilmesiydi (bunu düşünmedim), bu yüzden aynı pencereleri kullanan ancak farklı değerlere ihtiyaç duyan birden fazla makine karıştı.


3
setx FOOBAR ""

sadece FOOBAR değerinin boş bir dize olmasına neden olur. (Her ne kadar set"" komutuyla birlikte gösteriliyorsa dize çift tırnak olabilir.)

Kullandım:

set FOOBAR=

ve sonra FOOBAR artık set komutunda listelenmedi. (Oturumu kapatmak gerekmez.)

Windows 7 32 bit, komut istemini kullanarak, yönetici olmayan ben kullandım. (Cmd veya Windows+ değil R, farklı olabilir.)

BTW, oluşturduktan sonra kayıt defterinde hiçbir yerde oluşturduğum değişkeni görmedim. Yönetici olarak RegEdit kullanmıyorum .


1

Ayrıca küçük bir VBScript betiği de oluşturabilirsiniz :

Set env = CreateObject("WScript.Shell").Environment("System")
If env(WScript.Arguments(0)) <> vbNullString Then env.Remove WScript.Arguments(0)

O zaman şöyle deyin %windir%\System32\cscript.exe //Nologo "script_name.vbs" FOOBAR.

Dezavantajı, fazladan bir komut dosyasına ihtiyaç duymanızdır, ancak yeniden başlatma gerektirmez.

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.