Как удалить все переменные среды из сеанса оболочки Windows?

12

Если я начну новый сеанс оболочки Windows и введите:

env

Я вижу множество переменных окружения. Я хочу отладить запуск программы командной строки, удалив все переменные среды из текущего сеанса оболочки.

Я мог бы пойти по одному со следующим подходом:

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

Однако есть ли простой способ очистить их всех за один раз?

TiGz
источник
1
Что такое env? Я никогда не слышал об этом раньше, и это не работает здесь.
paradroid

Ответы:

13

Вы можете написать это в пакетном файле:

@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=
)

Он в основном проходит через каждую переменную среды, копирует их в командный файл ( backupenv.bat) и затем очищает каждую переменную. Для их восстановления вы можете запустить backupenv.batфайл.

багор
источник
Это круто. Благодарность! Одна маленькая вещь: файл backupenv.bat, кажется, имеет 2 конечных пробела в конце каждой строки SET A = B. Кажется, это приводит к ошибкам при восстановлении.
TiGz
Удален пробел после %% a = %% b, см. Отредактированный ответ. Должно быть хорошо сейчас.
Gaff
Это избавило от одного из двух пробелов ... один пробел остается в конце каждой строки SET. Что странно.
TiGz
Возможно, пространство было добавлено с того момента, когда вы ранее запустили мой (слегка сломанный) скрипт, и вы запустили пакет для восстановления ... добавив таким образом пробел для каждой переменной? Затем вы запустили его снова, и в выводе было бы два пробела? Если это так, то извините за то, что ранее все ваши переменные ставили с пробелом. Должно быть легко убрать хотя.
Gaff
Нет, я каждый раз открывал новую оболочку. Попробуй ... ты не получишь лишний пробел?
TiGz
6

Если вы хотите очистить только все переменные среды для пакетного файла, это станет еще проще.

@echo off
Setlocal enabledelayedexpansion
Set >set

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

В последней строке выводятся все переменные среды, которых не должно быть, подтверждающие работоспособность кода.

Поскольку Setlocalиспользуется, все изменения среды теряются после окончания пакета. Поэтому, если вы наберете Setпосле пакета, вы увидите, что все переменные среды все еще там, и, следовательно, нет необходимости сохранять их в файле резервной копии.

Аарон Лоу
источник
Пожалуйста, приложите некоторые усилия, чтобы использовать форматирование кода. Это делает вещи намного более читабельными.
boxspah
принятый ответ лучше, чем этот, поскольку у другого ответа есть способ сделать резервную копию существующего
SeanClt
@SeanClt Тебе нужно прочитать мой полный комментарий. Это говорит о том, что в этом случае резервное копирование не требуется.
Аарон Лоу
@scripthero В настоящее время я не могу отформатировать сообщения, извините
Аарон Лоу
Да, вы правы
SeanClt