Windows ma setx
polecenie:
Description:
Creates or modifies environment variables in the user or system
environment.
Możesz więc ustawić taką zmienną:
setx FOOBAR 1
Możesz wyczyścić wartość w ten sposób:
setx FOOBAR ""
Jednak zmienna nie jest usuwana. Pozostaje w rejestrze:
Jak więc właściwie usunąć zmienną?
windows
registry
environment-variables
Peter Mortensen
źródło
źródło
Odpowiedzi:
Aby usunąć zmienną z bieżącego środowiska ( nie na stałe):
Aby trwale usunąć zmienną ze środowiska użytkownika (które jest domyślnym miejscem
setx
umieszcza ją):Jeśli zmienna jest ustawiona w środowisku systemowym (np. Jeśli ustawiłeś ją pierwotnie za pomocą
setx /M
), jako administrator uruchom:Uwaga:
REG
powyższe polecenia nie wpłyną na żadne istniejące procesy (i niektóre nowe procesy, które są rozwidlone z istniejących procesów), więc jeśli ważne jest, aby zmiana zaczęła obowiązywać natychmiast, najłatwiej i najpewniejszą rzeczą do zrobienia jest wylogowanie się i ponowne zalogowanie lub uruchom ponownie. Jeśli to nie jest opcja lub chcesz zagłębić się w szczegóły, niektóre inne odpowiedzi tutaj zawierają kilka świetnych sugestii, które mogą pasować do twojego przypadku użycia.źródło
setx JUNK Hello
. Otwórz nowy cmd. Wpiszecho %JUNK%
i pobierzHello
. Następnie robięREG delete "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /F /V JUNK
i potwierdzam, że wartość zniknęła z rejestru. Otwieram nowe cmd i piszęecho %JUNK%
i nadal otrzymujęHello
. Przeszukiwanie rejestru nie wykazało obecności „JUNK”. Nie mów mi, że potrzebujesz restartu!user
wpisuję polecenie środowiska, kończy się to pomyślnie. Następnie, kiedy ponownie wpisuję polecenie, które otrzymujęThe system was unable to find the specified registry or key value
. Ponadto globalne wyszukiwanieJUNK
w rejestrzeregedit
nic nie daje . Mimo to, kiedy otwieram nowe okno poleceń (przez Start / akcesoria lub cmd.exe w Run) i wpisujęecho %JUNK%
, wartość nadal tam jest!SET
listy dla następnej powłoki cmd), a następnie usunąć go z rejestru, np .:SETX FOOBAR "" & REG delete HKCU\Environment /F /V FOOBAR
Aby usunąć zmienną z bieżącej sesji poleceń bez usuwania jej na stałe, użyj zwykłego wbudowanego
set
polecenia - po prostu nie wstaw nic po znaku równości:set FOOBAR=
Aby potwierdzić, uruchom
set
bez argumentów i sprawdź bieżące środowisko. Zmiennej powinno całkowicie brakować na liście.źródło
Omówiono to sporo, ale brakuje kluczowej informacji. Mam nadzieję, że pomogę wyjaśnić, jak to działa i przynieść ulgę zmęczonym podróżnikom. :-)
Usuń z bieżącego procesu
Oczywiście wszyscy wiedzą, że robisz to po prostu, aby usunąć zmienną środowiskową z bieżącego procesu:
Trwałe usuwanie
Istnieją dwa zestawy zmiennych środowiskowych, ogólnosystemowe i użytkownika.
Usuń zmienną środowiska użytkownika:
Usuń ogólnosystemową zmienną środowiskową:
Zastosuj wartość bez ponownego uruchamiania
Oto magiczne informacje, których brakuje! Zastanawiasz się, dlaczego po wykonaniu tej czynności, kiedy uruchamiasz nowe okno poleceń, zmienna środowiskowa nadal tam jest. Powodem jest to, że program explorer.exe nie zaktualizował swojego środowiska. Gdy jeden proces uruchamia inny, nowy proces dziedziczy środowisko po procesie, który go uruchomił.
Istnieją dwa sposoby rozwiązania tego problemu bez ponownego uruchamiania. Najbardziej brutalnym sposobem jest zabicie procesu explorer.exe i ponowne jego uruchomienie. Możesz to zrobić w Menedżerze zadań . Nie polecam jednak tej metody.
Innym sposobem jest poinformowanie programu explorer.exe, że środowisko się zmieniło i że powinien je ponownie przeczytać. Odbywa się to poprzez rozgłaszanie wiadomości Windows (WM_SETTINGCHANGE). Można to osiągnąć za pomocą prostego skryptu PowerShell. Możesz łatwo napisać taki, aby to zrobić, ale znalazłem go w ustawieniach okna aktualizacji po zmianach skryptowych :
Podsumowanie
Aby więc usunąć zmienną środowiskową użytkownika o nazwie „FOO” i odzwierciedlić zmianę w procesach uruchamianych później, wykonaj następujące czynności.
Uwaga, prawdopodobnie będziesz musiał zaktualizować ustawienia PowerShell, aby umożliwić uruchomienie tego skryptu, ale zostawię to jako ćwiczenie Google-fu.
źródło
source .bashrc
(lub jego kuzyni) w systemie Windows. To trafia na początek wiersza „odnieś się do tego”.Z PowerShell można skorzystać z
[System.Environment]::SetEnvironmentVariable()
metody .NET :Aby usunąć zmienną środowiskową użytkownika o nazwie
FOO
:Zauważ, że
$null
jest to używane do lepszego zasygnalizowania zamiaru usunięcia zmiennej, chociaż technicznie jest to to samo, co przekazanie''
w tym przypadku.Aby usunąć systemową zmienną środowiskową (na poziomie komputera) o nazwie
FOO
- wymaga podniesienia uprawnień ( musi być uruchomiona jako administrator):Oprócz szybszego wykonywania, zaletą
reg.exe
metody opartej na metodzie jest to, że inne aplikacje są powiadamiane o zmianie za pośrednictwemWM_SETTINGCHANGE
komunikatu (chociaż nie wszystkie aplikacje nasłuchują tego komunikatu).źródło
Zgadzam się z CupawnTae .
SET
nie jest użyteczny w przypadku zmian w środowisku głównym.FYI: zmienne systemowe są w
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
(znacznie dłużej niż użytkownika).Dlatego pełne polecenie dla zmiennej systemowej o nazwie FOOBAR to:
(Zwróć uwagę na cudzysłowy wymagane do obsługi spacji).
Szkoda
setx
polecenie nie obsługuje składni usuwania. :(PS: Używaj odpowiedzialnie - jeśli zabijesz zmienną ścieżki, nie obwiniaj mnie!
źródło
Polecenie w odpowiedzi DougWare nie zadziałało, ale to:
Skrót
HKLM
może służyć doHKEY_LOCAL_MACHINE
.źródło
Usuń bez ponownego uruchamiania
Na pytanie OP rzeczywiście udzielono obszernej odpowiedzi, w tym jak uniknąć ponownego uruchamiania za pomocą PowerShell, VBScript lub jak to nazwać.
Jeśli jednak musisz trzymać się tylko poleceń cmd i nie masz luksusu możliwości wywoływania PowerShell lub VBScript, możesz zastosować następujące podejście:
Więc magia polega na tym, że używając "setx" do przypisania czegoś do zmiennej, której nie potrzebujesz (w moim przykładzie DUMMY), zmuszasz Explorer.exe do ponownego odczytania zmiennych z rejestru, bez konieczności korzystania z PowerShell. Następnie wyczyścisz ten manekin i nawet jeśli pozostanie on w środowisku Explorera jeszcze przez chwilę, prawdopodobnie nikomu nie zaszkodzi.
Lub jeśli po usunięciu zmiennych musisz ustawić nowe, nie potrzebujesz nawet żadnego atrapy. Samo użycie SETX do ustawienia nowych zmiennych automatycznie wyczyści te, które właśnie usunąłeś z wszelkich nowych zadań cmd, które mogą się rozpocząć.
Informacje ogólne: Właśnie z powodzeniem zastosowałem to podejście, aby zastąpić zestaw zmiennych użytkownika zmiennymi systemowymi o tej samej nazwie na wszystkich komputerach w mojej pracy, modyfikując istniejący skrypt cmd. Jest zbyt wiele komputerów, aby zrobić to ręcznie, ani skopiowanie do nich wszystkich dodatkowych programów PowerShell lub VBScript nie było praktyczne. Powodem, dla którego pilnie potrzebowałem zastąpić użytkownika zmiennymi systemowymi, było to, że zmienne użytkownika są synchronizowane w profilach mobilnych (nie myślałem o tym), więc wiele komputerów używających tego samego logowania do systemu Windows, ale wymagających różnych wartości, zostało pomieszanych.
źródło
po prostu powoduje, że wartość FOOBAR jest łańcuchem pustym. (Chociaż pokazuje się z rozszerzeniem
set
poleceniem z „”, więc może to być ciąg znaków w cudzysłowie).Użyłem:
a następnie FOOBAR nie był już wymieniony w komendzie set. (Wylogowanie nie było wymagane.)
Windows 7 32-bitowy, używając wiersza poleceń, użyłem bez administratora. (Nie cmd ani Windows+ R, które mogą być inne).
Przy okazji, nie widziałem zmiennej, którą utworzyłem w żadnym miejscu rejestru po jej utworzeniu. używam RegEdit nie jako administrator.
źródło
Możesz także utworzyć mały skrypt VBScript :
Następnie nazwij to jak
%windir%\System32\cscript.exe //Nologo "script_name.vbs" FOOBAR
.Wadą jest to, że potrzebujesz dodatkowego skryptu, ale nie wymaga on ponownego uruchomienia.
źródło