Como cancelar a definição de uma variável do MS-DOS?

88

Digamos que eu execute o seguinte no shell CMD:

set FOO=bar

Existe uma maneira de undefine esta variável, diferente de reciclar o shell CMD?

user288004
fonte
9
Você realmente quer dizer MS-DOS (que está morto há pelo menos 10 anos ou mais) - ou você diz MS-DOS, mas realmente se refere à linha de comando do Windows ( cmd.exe) ??
marc_s
4
Provavelmente, mas isso realmente não importa para essa pergunta ...
Madara's Ghost
3
Marc está certo. Este não é o shell do MS-DOS. As pessoas nunca aprendem que isso é uma grande diferença.
Michael-O
@MadaraUchiha, De fato, sua set var=resposta funciona no MS-DOS 6.22 command.com da mesma forma que no Windows cmd.exe. (No entanto, ao contrário do Windows, colocar aspas duplas em torno de var = não funciona; em vez disso, ele cria uma variável de ambiente cujo nome começa com aspas duplas.)
Simon Kissane

Respostas:

136

Sim, você pode desarmar com

set FOO=

Ou usando explicitamente:

set "FOO="

Certifique-se de que nenhum caractere estranho (invisível) atrás do =sinal. Isso é:

  • set FOO=é diferente de set FOO=      .
Fantasma de madara
fonte
29

Uma maneira segura de remover a definição da variável é usar também aspas, então não haverá problemas com espaços à direita.

set FOO=bar
echo %FOO%
set "FOO=" text after the last quote is ignored
echo %FOO%
Jeb
fonte
11

outro método

@Echo oFF

setlocal
set FOO=bar
echo %FOO%
endlocal

echo %FOO%

pause

Nota: Isso não funcionaria em um prompt de comando interativo. Mas funciona em script de lote.

walid2mi
fonte
9

Isso funciona para mim no meu shell CMD do Windows 7:

set FOO=bar
echo %FOO% // bar
set FOO=
echo %FOO% // empty; calling "set" no longer lists it
Pekka
fonte
2
Os espaços são significativos no setcomando. Se você tentar set FOO = bare depois tentar set FOO=, não removerá 'FOO'. Por alguma razão, porém, eles não são (como?) Significativos por dentro % %.
Ted Hopp de
O espaço à direita também é importante. Desculpe pela edição, achei que seu representante dissesse 270, não 270k ... oops. Costumo editar as respostas quando o representante sugere que o usuário não vai voltar. Obviamente, não é o caso aqui. Meu erro.
chappjc de
@chappjs sem problemas, obrigado pela edição! Não tenho certeza de como eu perdi isso.
Pekka
4

Eu ofereceria o seguinte apenas como um comentário, mas acho que é importante o suficiente para ser autônomo.

Muitas das respostas anteriores mencionaram que é preciso ter cuidado com espaços à direita; e com certeza isso é verdade. No entanto, descobri que às vezes os espaços finais só querem entrar lá, não importa o que aconteça - particularmente se você estiver fazendo uma linha de comando de uma linha e precisar do espaço como separador de comando.

Esta é a solução para esse problema:

SET FOO=Bar
echo %FOO%
:: outputs Bar
SET "FOO="
echo %FOO%
:: outputs %FOO%

Colocando a declaração entre aspas duplas dessa maneira, o problema de espaçamento pode ser totalmente evitado. Isso também pode ser muito útil quando as variáveis ​​são criadas concatenando para eliminar espaços entre - por exemplo - caminhos, por exemplo:

SET A=c:\users\ && SET D=Daniel
SET P="%a%%d%"
ECHO %P%
:: outputs "C:\Users\ Daniel"
:: Notice the undesirable space there
dgo
fonte