Dòng lệnh để loại bỏ một biến môi trường khỏi cấu hình cấp hệ điều hành


182

Windows có setxlệnh:

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

Vì vậy, bạn có thể đặt một biến như thế này:

setx FOOBAR 1

Và bạn có thể xóa giá trị như thế này:

setx FOOBAR ""

Tuy nhiên, biến không được loại bỏ. Nó vẫn còn trong sổ đăng ký:

foobar

Vì vậy, làm thế nào bạn thực sự sẽ loại bỏ các biến?


3
setx chỉ đặt biến. Bạn đang làm trống nó với dòng đó.
Fox Wilson


Vì tôi đã đào được một số tiền khá lớn, cũng xem superuser.com/q/297947/46834 để biết các tùy chọn dòng không phải lệnh.
gary

Câu trả lời:


215

Để loại bỏ biến khỏi môi trường hiện tại ( không vĩnh viễn):

set FOOBAR=

Để xóa vĩnh viễn biến khỏi môi trường người dùng (là nơi mặc định setxđặt nó):

REG delete HKCU\Environment /F /V FOOBAR

Nếu biến được đặt trong môi trường hệ thống (ví dụ: nếu ban đầu bạn đặt nó với setx /M), khi quản trị viên chạy:

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

Lưu ý: Các REGlệnh trên sẽ không ảnh hưởng đến bất kỳ quy trình hiện có nào (và một số quy trình mới được phân tách từ các quy trình hiện có), vì vậy, nếu điều quan trọng là thay đổi có hiệu lực ngay lập tức, điều dễ nhất và chắc chắn nhất là đăng xuất và đăng nhập lại hoặc khởi động lại. Nếu đây không phải là một tùy chọn hoặc bạn muốn tìm hiểu sâu hơn, một số câu trả lời khác ở đây có một số gợi ý tuyệt vời có thể phù hợp với trường hợp sử dụng của bạn.


1
Giải pháp này dường như không hoạt động - hoặc tôi đang hiểu nhầm điều gì đó cơ bản. Tôi làm setx JUNK Hello. Mở cmd mới. Nhập echo %JUNK%và nhận Hello. Sau đó, tôi làm REG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V JUNKvà xác nhận rằng giá trị đã biến mất khỏi registry. Tôi mở cmd mới và gõ echo %JUNK%và vẫn nhận được Hello. Tìm kiếm đăng ký cho thấy không có sự hiện diện của 'JUNK'. Xin đừng nói với tôi rằng bạn cần khởi động lại!
caasjj

Cảm ơn vi đa trả lơi. Tôi đang mở một cửa sổ lệnh mới từ menu Start. Tôi đã thử cả hai phiên bản của lệnh. Trong thực tế, lần đầu tiên khi tôi gõ userlệnh môi trường, nó đã thành công. Sau đó, khi tôi gõ lại lệnh tôi nhận đượcThe system was unable to find the specified registry or key value . Ngoài ra, một tìm kiếm toàn cầu JUNKtrong sổ đăng ký với regeditkhông có gì. Tuy nhiên, khi tôi mở một cửa sổ Lệnh mới (thông qua Bắt đầu / phụ kiện hoặc cmd.exe trong Run) và nhập echo %JUNK%, giá trị vẫn còn đó!
caasjj

1
Ah! Bạn cho rằng lý trí là gì cho điều đó ?? Tôi luôn tránh quản trị viên càng nhiều càng tốt - nâng cấp UNIX / BSD / Linux. Cảm ơn một mil cho sự siêng năng tuyệt vời. +1
caasjj

4
có thể đó chỉ là ngữ nghĩa, nhưng việc xóa (từ sổ đăng ký) có hiệu lực ngay lập tức. Môi trường không được khởi tạo lại từ sổ đăng ký cho đến khi bạn đăng nhập lại. Bạn có thể kết hợp 2 lệnh để loại bỏ nó khỏi môi trường hiện tại (sẽ loại bỏ nó khỏiSET danh sách cho shell cmd tiếp theo) và sau đó xóa nó khỏi registry, ví dụ:SETX FOOBAR "" & REG delete HKCU\Environment /F /V FOOBAR
Luke

1
Lý do môi trường dường như không được cập nhật mà không khởi động lại là vì explorer.exe không biết rằng nó đã được cập nhật. Xem câu trả lời của tôi để giải thích đầy đủ và giải pháp.
Jamie

72

Để loại bỏ biến khỏi phiên lệnh hiện tại mà không xóa vĩnh viễn, hãy sử dụng lệnh tích hợp thông thường set- chỉ cần đặt gì sau dấu bằng:

set FOOBAR=

Để xác nhận, chạy setkhông có đối số và kiểm tra môi trường hiện tại. Các biến nên thiếu trong danh sách hoàn toàn.

Ghi chú : điều này sẽ chỉ loại bỏ biến khỏi môi trường hiện tại - nó sẽ không tiếp tục thay đổi sổ đăng ký. Khi một quá trình lệnh mới được bắt đầu, biến sẽ trở lại.


77
Đây chắc chắn KHÔNG phải là câu trả lời, và tôi thấy thật đáng lo ngại khi có rất nhiều lượt bình chọn. Điều này chỉ hiệu quả cho phiên lệnh hiện tại. Tạo một cửa sổ lệnh mới và var trở lại.
joescii

6
@joescii Bạn thấy điều này đáng ngạc nhiên? Điều này đã trả lời câu hỏi trong tiêu đề câu hỏi. Vì vậy, rõ ràng tiêu đề câu hỏi cần phải được cụ thể hơn.
oberlies

10
@oberlies Tôi không đồng ý rằng nó trả lời câu hỏi trong tiêu đề, bởi vì điều này KHÔNG hoạt động ở cấp độ hệ điều hành, mà chỉ trong cửa sổ lệnh hiện tại. Thứ hai, quan điểm của bạn cho thấy phần chi tiết của câu hỏi là không liên quan.
joescii

3
@oberlies thật không may, bản chỉnh sửa dường như không thực hiện được mánh khóe - nó vẫn đang được nâng cấp. Tôi đoán mọi người thấy nó hữu ích ngay cả khi nó không trả lời câu hỏi thực tế, trong trường hợp đó có lẽ nó xứng đáng với các upvote (phải không?). Ít nhất nó không được đánh dấu là chấp nhận, điều này sẽ gây hiểu nhầm.
CupawnTae

3
Tôi phải bình luận tại sao tôi đánh giá thấp. Rõ ràng bởi vì điều này chỉ hoạt động trong phiên hiện tại.
Ian Grainger

22

Điều này đã được đề cập khá nhiều, nhưng có một thông tin quan trọng bị thiếu. Hy vọng, tôi có thể giúp làm rõ cách thức hoạt động của nó và cung cấp một số cứu trợ cho khách du lịch mệt mỏi. :-)

Xóa khỏi quy trình hiện tại

Rõ ràng, mọi người đều biết rằng bạn chỉ cần làm điều này để xóa một biến môi trường khỏi quy trình hiện tại của bạn:

set FOO=

Xóa liên tục

Có hai bộ biến môi trường, toàn hệ thống và người dùng.

Xóa biến môi trường người dùng:

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

Xóa biến môi trường toàn hệ thống:

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

Áp dụng giá trị mà không cần khởi động lại

Đây là thông tin ma thuật còn thiếu! Bạn đang tự hỏi tại sao sau khi bạn làm điều này, khi bạn khởi chạy một cửa sổ lệnh mới, biến môi trường vẫn còn đó. Lý do là vì explorer.exe chưa cập nhật môi trường của nó. Khi một quy trình khởi chạy một quy trình khác, quy trình mới sẽ kế thừa môi trường từ quy trình đã khởi chạy nó.

Có hai cách để khắc phục điều này mà không cần khởi động lại. Cách mạnh mẽ nhất là giết quá trình explorer.exe của bạn và bắt đầu lại. Bạn có thể làm điều đó từ Trình quản lý tác vụ . Tôi không khuyên dùng phương pháp này, tuy nhiên.

Một cách khác là bằng cách nói với explorer.exe rằng môi trường đã thay đổi và nó sẽ đọc lại nó. Điều này được thực hiện bằng cách truyền phát một thông báo Windows (WM_SETTINGCHANGE). Điều này có thể được thực hiện với một tập lệnh PowerShell đơn giản. Bạn có thể dễ dàng viết một cái để làm điều này, nhưng tôi đã tìm thấy một trong Cài đặt cửa sổ cập nhật sau khi thay đổi theo kịch bản :

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);

Tóm lược

Vì vậy, để xóa biến môi trường người dùng có tên "FOO" và thay đổi được phản ánh trong các quy trình bạn khởi chạy sau đó, hãy làm như sau.

  1. Lưu tập lệnh PowerShell vào một tệp (chúng tôi sẽ gọi nó là updateenv.ps1).
  2. Thực hiện việc này từ dòng lệnh: reg xóa "HKCU \ Môi trường" / v FOO / f
  3. Chạy updateenv.ps1.
  4. Đóng và mở lại dấu nhắc lệnh của bạn và bạn sẽ thấy biến môi trường không còn được xác định.

Lưu ý, có thể bạn sẽ phải cập nhật cài đặt PowerShell để cho phép bạn chạy tập lệnh này, nhưng tôi sẽ để nó như một bài tập Google-fu cho bạn.


Có bất kỳ lý do cụ thể nào mà bạn không khuyên bạn nên giết và khởi động lại explorer không? Tôi làm nó suốt.
Prometheus

Vâng, có hai cái đầu tiên đến với tâm trí. Đầu tiên là các quá trình tiêu diệt lực có thể gây rò rỉ bộ nhớ. Đúng, các quy trình được coi là hộp cát, nhưng ngay cả Trình quản lý tác vụ Windows cũng cảnh báo bạn không nên làm điều này một cách nhẹ nhàng. Lý do cá nhân khác là OCD của tôi. Khi bạn tắt và khởi động lại Explorer, tất cả các biểu tượng của bạn trong thanh tác vụ, bao gồm cả các bản sao khi bạn nhấp vào một, được sắp xếp lại. Tôi thích các biểu tượng của mình giữ theo thứ tự mà tôi đã mở.
Jamie

1
Ồ Lệnh ma thuật mà tôi đang tìm kiếm hoạt động như source .bashrc(hoặc anh em họ của nó) trong Windows. Điều này đi đến đầu dòng "giới thiệu đến" này cho tôi.
bballdave025

18

Từ PowerShell, bạn có thể sử dụng [System.Environment]::SetEnvironmentVariable()phương thức .NET :

  • Để loại bỏ một biến môi trường người dùng có tên FOO:

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

Lưu ý rằng $nullđược sử dụng để báo hiệu tốt hơn ý định loại bỏ biến, mặc dù về mặt kỹ thuật, nó thực sự giống như chuyển ''trong trường hợp này.

  • Để loại bỏ một hệ thống (máy cấp) biến môi trường được đặt tên FOO- đòi hỏi cao (phải được chạy as administrator):

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

Ngoài việc thực thi nhanh hơn, ưu điểm của reg.exephương pháp dựa trêncác ứng dụng khác được thông báo về sự thay đổi , thông qua một WM_SETTINGCHANGEtin nhắn (mặc dù không phải tất cả các ứng dụng đều nghe tin nhắn đó).


2
Đây là câu trả lời tốt nhất ở đây.
James

1
Phương pháp này tránh sự cần thiết phải khởi động lại. Thật là một giải pháp tao nhã!
jyao

13

Tôi đồng ý với CupawnTae .

SET không hữu ích cho những thay đổi đối với môi trường chính.

FYI: Biến hệ thống nằm trong HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment (một thỏa thuận tốt lâu hơn so với vars người dùng).

Do đó, lệnh đầy đủ cho một var hệ thống có tên FOOebar là:

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

(Lưu ý các trích dẫn cần thiết để xử lý không gian.)

Thật là tệ setx lệnh không hỗ trợ cú pháp xóa. :

PS: Sử dụng có trách nhiệm - Nếu bạn giết biến đường dẫn của mình, đừng đổ lỗi cho tôi!


@CMCDragonkai được đề cập rõ ràng trong câu hỏi ban đầu - nó không xóa mục đăng ký, nó chỉ làm trống nó. Câu hỏi thực tế là làm thế nào để xóa nó khỏi sổ đăng ký
CupawnTae

1
Tôi chỉ cần thêm bạn có thể cần phải khởi động lại / làm mới cmd trước khi điều này có hiệu lực.
jiggunjer

@jiggunjer, Làm thế nào để làm mới?
Pacerier

@Pacerier chỉ cần mở một thiết bị đầu cuối mới.
jiggunjer

11

Lệnh trong câu trả lời của DougWare không hoạt động, nhưng điều này đã làm:

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

Các phím tắt HKLMcó thể được sử dụng cho HKEY_LOCAL_MACHINE.


1
Ngoài ra, các biến môi trường người dùng nằm trong "HKCU \ Môi trường"
tzrlk

1
@Tzrlk, lý do cho sự không phù hợp là gì? Tại sao nó không có trong HKLM \ Môi trường ở đó?
Pacerier

@Pacerier: Tôi không biết tại sao họ lại đặt chúng ở những vị trí hoàn toàn riêng biệt như vậy, nhưng nếu bạn muốn đảm bảo rằng bạn đã xóa / cả hai biến hệ thống hoặc / và người dùng, điều đó giúp biết rằng chúng ở hoàn toàn khác nhau nơi.
tzrlk

2
@Tzrlk, Phải là một số thiết kế bắt vít ở phía Windows một lần nữa.
Pacerier

4

Xóa mà không cần khởi động lại

Câu hỏi của OP thực sự đã được trả lời rộng rãi, bao gồm cả cách tránh khởi động lại thông qua powershell, vbscript hoặc bạn đặt tên cho nó.

Tuy nhiên, nếu bạn chỉ cần tuân theo các lệnh cmd và không có khả năng gọi powershell hoặc vbscript, bạn có thể sử dụng phương pháp sau:

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

Vì vậy, điều kỳ diệu ở đây là bằng cách sử dụng "setx" để gán một cái gì đó cho một biến bạn không cần (trong ví dụ DUMMY của tôi), bạn buộc Explorer.exe đọc lại các biến từ sổ đăng ký, mà không cần powershell. Sau đó, bạn dọn sạch hình nộm đó, và mặc dù người đó sẽ ở trong môi trường của Người thám hiểm lâu hơn một chút, nó có thể sẽ không gây hại cho ai.

Hoặc nếu sau khi xóa các biến bạn cần đặt biến mới, thì bạn thậm chí không cần bất kỳ hình nộm nào. Chỉ cần sử dụng SETX để đặt các biến mới sẽ tự động xóa các biến bạn vừa xóa khỏi mọi tác vụ cmd mới có thể bắt đầu.

Thông tin cơ bản: Tôi vừa sử dụng phương pháp này thành công để thay thế một tập hợp các biến người dùng bằng các biến hệ thống cùng tên trên tất cả các máy tính trong công việc của tôi, bằng cách sửa đổi tập lệnh cmd hiện có. Có quá nhiều máy tính để thực hiện thủ công, cũng không thực tế để sao chép thêm các quyền hạn hoặc vbscripts cho tất cả chúng. Lý do tôi rất cần thay thế người dùng bằng các biến hệ thống là các biến người dùng được đồng bộ hóa trong cấu hình chuyển vùng (không nghĩ về điều đó), vì vậy nhiều máy sử dụng cùng một cửa sổ đăng nhập nhưng cần các giá trị khác nhau, đã bị lẫn lộn.


3
setx FOOBAR ""

chỉ làm cho giá trị của FOOebar là một chuỗi rỗng. (Mặc dù, nó hiển thị vớiset lệnh có dấu "" nên có thể dấu ngoặc kép là chuỗi.)

Tôi đã sử dụng:

set FOOBAR=

và sau đó FOOebar không còn được liệt kê trong lệnh set. (Không cần đăng xuất.)

Windows 7 32 bit, sử dụng dấu nhắc lệnh, không phải quản trị viên là những gì tôi đã sử dụng. (Không phải cmd hoặc Windows+ R, có thể khác nhau.)

BTW, tôi không thấy biến tôi đã tạo ở bất cứ đâu trong sổ đăng ký sau khi tôi tạo nó. Tôi đang sử dụng RegEdit không phải là quản trị viên.


1

Bạn cũng có thể tạo một tập lệnh VBScript nhỏ :

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

Sau đó gọi nó như %windir%\System32\cscript.exe //Nologo "script_name.vbs" FOOBAR .

Nhược điểm là bạn cần một tập lệnh bổ sung, nhưng nó không yêu cầu khởi động lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.