Как удалить переменную cmd?

Допустим, я выполняю следующее в оболочке CMD:

SET "FOO=bar"

Есть ли способ отменить определение этой переменной, кроме повторного использования оболочки CMD?


person user288004    schedule 28.08.2011    source источник
comment
Вы действительно имеете в виду MS-DOS (которая умерла как минимум 10 лет или около того) или вы говорите MS-DOS, но на самом деле имеете в виду командную строку Windows ( cmd.exe) ??   -  person marc_s    schedule 28.08.2011
comment
Возможно, но это не имеет большого значения для этого вопроса...   -  person Madara's Ghost    schedule 28.08.2011
comment
Марк прав. Это не оболочка MS-DOS. Люди никогда не узнают, что это большая разница.   -  person Michael-O    schedule 28.08.2011
comment
@MadaraUchiha, действительно, ваш ответ set var= работает в MS-DOS 6.22 command.com точно так же, как и в Windows cmd.exe. (Однако, в отличие от Windows, заключение var= в двойные кавычки не работает, вместо этого создается переменная среды, имя которой начинается с двойной кавычки.)   -  person Simon Kissane    schedule 13.07.2016


Ответы (5)


Да, вы можете отключить его с помощью

set FOO=

Или явно используя:

set "FOO="

Убедитесь, что после знака = не идут посторонние (невидимые) символы. То есть:

  • set FOO= отличается от set FOO=      .
person Madara's Ghost    schedule 28.08.2011

Безопасный способ сбросить переменную — использовать также кавычки, тогда не будет проблем с конечными пробелами.

set FOO=bar
echo %FOO%
set "FOO=" text after the last quote is ignored
echo %FOO%
person jeb    schedule 28.08.2011

другой метод

@Echo oFF

setlocal
set FOO=bar
echo %FOO%
endlocal

echo %FOO%

pause

Примечание. Это не будет работать в интерактивной командной строке. Но работает в пакетном сценарии.

person walid2mi    schedule 28.08.2011

Это работает для меня в моей оболочке Windows 7 CMD:

set FOO=bar
echo %FOO% // bar
set FOO=
echo %FOO% // empty; calling "set" no longer lists it
person Pekka    schedule 28.08.2011
comment
В команде set важны пробелы. Если вы попробуете set FOO = bar, а затем set FOO=, это не удалит 'FOO'. Однако по какой-то причине они не (насколько?) значимы внутри % %. - person Ted Hopp; 28.08.2011
comment
Завершающий пробел также важен. Извините за редактирование, я думал, что ваш представитель сказал 270, а не 270 тысяч... ой. Я часто редактирую ответы, когда представитель предполагает, что пользователь больше не вернется. Очевидно, что здесь не так. Виноват. - person chappjc; 10.02.2015
comment
@chappjs нет проблем, спасибо за редактирование! Не знаю, как я это пропустил. - person Pekka; 10.02.2015

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

Во многих предыдущих ответах упоминалось, что нужно остерегаться конечных пробелов; и наверняка это правда. Однако я обнаружил, что иногда конечные пробелы просто хотят попасть туда, несмотря ни на что, особенно если вы выполняете однострочную командную строку и нуждаетесь в пробеле в качестве разделителя команд.

Это решение этой проблемы:

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

Таким образом, заключив объявление в двойные кавычки, можно полностью избежать проблемы с пробелами. Это также может быть очень полезно, когда переменные создаются путем конкатенации для устранения пробелов между, например, путями, например:

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