Como limpo todas as variáveis ​​de ambiente de uma sessão de shell do Windows?

12

Se eu iniciar uma nova sessão de shell do Windows e digite:

env

Eu vejo muitas variáveis ​​de ambiente definidas. Desejo depurar a execução de um programa de linha de comando removendo todas as variáveis ​​de ambiente da sessão atual do shell.

Eu poderia ir embora um por um com a seguinte abordagem:

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

No entanto, existe uma maneira simples de limpar todos de uma só vez?

TiGz
fonte
1
O que é env? Eu nunca ouvi falar disso antes, e não funciona aqui.
Paradroid 5/12

Respostas:

13

Você pode escrever isso em um arquivo em lotes:

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

Basicamente, executa cada variável de ambiente, faz o backup em um arquivo em lotes ( backupenv.bat) e depois limpa cada variável. Para restaurá-los, você pode executar o backupenv.batarquivo.

Gaff
fonte
Isso é ótimo. Obrigado! Uma coisa pequena: o arquivo backupenv.bat parece ter 2 espaços à direita no final de cada linha SET A = B. Isso parece estragar algumas variáveis ​​na restauração.
TiGz
Removido o espaço após %% a = %% b, veja a resposta editada. Deve estar bem agora.
Gaff
Isso se livrou de um dos dois espaços ... um espaço permanece no final de cada linha SET. O que é estranho.
TiGz 4/11/16
Talvez o espaço tenha sido adicionado quando você executou meu script (um pouco quebrado) anteriormente e executou o lote para restaurar ... adicionando um espaço a cada variável? Então você executou novamente e na saída teria dois espaços? Se esse for o caso, desculpe-se por ter previamente sufixado todas as suas variáveis ​​com um espaço. Deve ser fácil de limpar embora.
Gaff 5/05
Nah - eu estava abrindo um novo shell a cada vez. Experimente ... você não acaba com um espaço extra?
TiGz 5/05
6

Se você deseja limpar apenas todas as variáveis ​​de ambiente do arquivo em lotes, fica ainda mais fácil.

@echo off
Setlocal enabledelayedexpansion
Set >set

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

A linha final gera todas as variáveis ​​de ambiente, que não devem ser nenhuma, confirmando o código trabalhado.

Como Setlocalé usado, todas as alterações no ambiente são perdidas após o término do lote. Portanto, se você digitar Setapós o lote, verá que todas as variáveis ​​de ambiente ainda estão lá, não sendo necessário armazená-lo em um arquivo de backup.

Aaron Lowe
fonte
Faça algum esforço para usar a formatação de código. Isso torna as coisas muito mais legíveis.
boxspah
resposta aceita é melhor do que isso como a outra resposta tem uma forma de backup existente
SeanClt
@SeanClt Você precisa ler meu comentário completo. Dizem que o backup não é necessário neste caso.
Aaron Lowe
@scripthero No momento, não consigo formatar as postagens, desculpe #
Aaron Lowe
Sim, você está certo #
SeanClt 27/03