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.
- PowerShell betiğini bir dosyaya kaydedin (buna updateenv.ps1 adını vereceğiz).
- Bunu komut satırından yapın: reg delete "HKCU \ Environment" / v FOO / f
- Updateenv.ps1 komutunu çalıştırın.
- 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.