¿Cómo anular la definición de una variable de MS-DOS?

88

Digamos que ejecuto lo siguiente en el shell CMD:

set FOO=bar

¿Hay alguna forma de indefinir esta variable, además de reciclar el shell CMD?

user288004
fuente
9
¿ Realmente te refieres a MS-DOS (que ha estado muerto durante al menos 10 años más o menos), o dices MS-DOS pero realmente te refieres a la línea de comandos de Windows ( cmd.exe)?
marc_s
4
Probablemente, pero realmente no importa para esa pregunta ...
Madara's Ghost
3
Marc tiene razón. Este no es el shell de MS-DOS. La gente nunca aprende que esta es una gran diferencia.
Michael-O
@MadaraUchiha, De hecho, su set var=respuesta funciona con MS-DOS 6.22 command.com de la misma manera que con Windows cmd.exe. (Sin embargo, a diferencia de Windows, poner comillas dobles alrededor de var = no funciona, sino que crea una variable de entorno cuyo nombre comienza con una comilla doble).
Simon Kissane

Respuestas:

136

Sí, puedes desarmarlo con

set FOO=

O usando explícitamente:

set "FOO="

Asegúrese de que no aparezcan caracteres extraños (invisibles) después del =signo. Es decir:

  • set FOO=es diferente de set FOO=      .
Fantasma de Madara
fuente
29

Una forma segura de desarmar la variable es usar también comillas, entonces no hay problemas con los espacios finales.

set FOO=bar
echo %FOO%
set "FOO=" text after the last quote is ignored
echo %FOO%
jeb
fuente
11

otro método

@Echo oFF

setlocal
set FOO=bar
echo %FOO%
endlocal

echo %FOO%

pause

Nota: esto no funcionaría en un símbolo del sistema interactivo. Pero funciona en secuencia de comandos por lotes.

walid2mi
fuente
9

Esto funciona para mí en mi shell CMD de Windows 7:

set FOO=bar
echo %FOO% // bar
set FOO=
echo %FOO% // empty; calling "set" no longer lists it
Pekka
fuente
2
Los espacios son importantes en el setcomando. Si lo intenta set FOO = bary luego lo intenta set FOO=, no desarmará 'FOO'. Sin embargo, por alguna razón, no son (¿tan?) Importantes por dentro % %.
Ted Hopp
El espacio final también es importante. Perdón por la edición, pensé que su representante dijo 270, no 270k ... Ups. A menudo edito las respuestas cuando el representante sugiere que el usuario no regresará. Obviamente no es el caso aquí. Mi error.
chappjc
@chappjs no hay problema, ¡gracias por la edición! No estoy seguro de cómo me perdí eso.
Pekka
4

Ofrecería lo siguiente solo como comentario, pero creo que es lo suficientemente importante como para valerse por sí solo.

Muchas de las respuestas anteriores mencionaron que hay que tener cuidado con los espacios finales; y seguro que es cierto. Sin embargo, descubrí que a veces los espacios finales solo quieren ingresar allí sin importar qué, particularmente si está haciendo una línea de comando de una sola línea y necesita el espacio como un separador de comando.

Esta es la solución a ese problema:

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

Al envolver la declaración entre comillas dobles de esa manera, el problema del espaciado se puede evitar por completo. Esto también puede ser realmente útil cuando las variables se crean concatenando para eliminar espacios entre, por ejemplo, rutas, por ejemplo:

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