Jak wyczyścić wszystkie zmienne środowiskowe z sesji powłoki Windows?

12

Jeśli rozpocznę nową sesję powłoki systemu Windows i napiszę:

env

Widzę wiele ustawionych zmiennych środowiskowych. Chcę debugować działanie programu wiersza polecenia, usuwając wszystkie zmienne środowiskowe z bieżącej sesji powłoki.

Mógłbym przejść jeden po drugim, stosując następujące podejście:

SET FOO=
SET BAR=
SET ... ... ...

Czy istnieje jednak prosty sposób na usunięcie ich wszystkich za jednym razem?

TiGz
źródło
1
Co to jest env? Nigdy wcześniej o tym nie słyszałem i tutaj to nie działa.
paradroid

Odpowiedzi:

14

Możesz to zapisać w pliku wsadowym:

@echo off
if exist ".\backupenv.bat" del ".\backupenv.bat"
for /f "tokens=1* delims==" %%a in ('set') do (
echo set %%a=%%b>> .\backupenv.bat
set %%a=
)

Zasadniczo przebiega przez każdą zmienną środowiskową, tworzy kopię zapasową pliku wsadowego ( backupenv.bat), a następnie usuwa każdą zmienną. Aby je przywrócić, możesz uruchomić backupenv.batplik.

Gafel
źródło
To jest świetne. Dzięki! Jedna mała rzecz: wydaje się, że plik backupenv.bat ma 2 końcowe spacje na końcu każdej linii SET A = B. Wydaje się, że to psuje niektóre zmienne przy przywracaniu.
TiGz
Usunięto spację po %% a = %% b, patrz edytowana odpowiedź. Teraz powinno być dobrze.
Gaff
Pozbyło się to jednego z dwóch pól ... jedno miejsce pozostaje na końcu każdej linii SET. Co jest dziwne.
TiGz
Być może przestrzeń została dodana, kiedy wcześniej uruchomiłeś mój (nieco zepsuty) skrypt i uruchomiłeś partię, aby przywrócić ... dodając spację do każdej zmiennej? Potem uruchomiłeś go ponownie i na wyjściu miałby dwie spacje? Jeśli tak jest, to przepraszam, że poprzednio dodałem spację do wszystkich zmiennych. Powinno być jednak łatwe do wyczyszczenia.
Gaff
Nie - za każdym razem otwierałem nową powłokę. Spróbuj ... czy nie masz dodatkowej przestrzeni?
TiGz
6

Jeśli chcesz tylko wyczyścić wszystkie zmienne środowiskowe dla pliku wsadowego, staje się to jeszcze łatwiejsze.

@echo off
Setlocal enabledelayedexpansion
Set >set

For /F "tokens=1* delims==" %%i in (set) do set %% %i=
Del set
Set

Ostatni wiersz wyprowadza wszystkie zmienne środowiskowe, które nie powinny być żadnymi, potwierdzając działanie kodu.

Ponieważ Setlocaljest używany, wszystkie zmiany środowiska są tracone po zakończeniu partii. Więc jeśli wpiszesz Setpo partii, zobaczysz, że wszystkie zmienne środowiskowe nadal tam są, dlatego nie musisz przechowywać jej w pliku kopii zapasowej.

Aaron Lowe
źródło
Spróbuj użyć formatowania kodu. Sprawia, że ​​rzeczy są znacznie bardziej czytelne.
boxspah
zaakceptowana odpowiedź jest lepsza niż ta, ponieważ druga odpowiedź ma sposób na wykonanie kopii zapasowej istniejącej
SeanClt
@SeanClt Musisz przeczytać cały mój komentarz. Mówi się, że w tym przypadku kopia zapasowa nie jest potrzebna.
Aaron Lowe
@scripthero Obecnie nie mogę sformatować postów, przepraszam
Aaron Lowe
Tak masz rację
SeanClt