Как отменить определение переменной MS-DOS?

88

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

set FOO=bar

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

user288004
источник
9
Вы действительно имеете в виду MS-DOS (которая была мертва по крайней мере 10 лет или около того) - или вы говорите MS-DOS, но на самом деле имеете в виду командную строку Windows ( cmd.exe) ??
marc_s
4
Скорее всего, но это не имеет значения для этого вопроса ...
Призрак Мадары
3
Марк прав. Это не оболочка MS-DOS. Люди никогда не узнают, что это большая разница.
Michael-O
@MadaraUchiha, Действительно, ваш set var=ответ работает под MS-DOS 6.22 command.com точно так же, как и под Windows cmd.exe. (Однако, в отличие от Windows, двойные кавычки вокруг var = не работают, вместо этого создается переменная среды, имя которой начинается с двойной кавычки.)
Саймон Киссан

Ответы:

136

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

set FOO=

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

set "FOO="

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

  • set FOO=отличается от set FOO=      .
Призрак Мадары
источник
29

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

set FOO=bar
echo %FOO%
set "FOO=" text after the last quote is ignored
echo %FOO%
Jeb
источник
11

другой метод

@Echo oFF

setlocal
set FOO=bar
echo %FOO%
endlocal

echo %FOO%

pause

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

walid2mi
источник
9

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

set FOO=bar
echo %FOO% // bar
set FOO=
echo %FOO% // empty; calling "set" no longer lists it
Пекка
источник
2
В setкоманде важны пробелы . Если вы попробуете, set FOO = barа потом попробуете set FOO=, он не сбросит "FOO". Но почему-то внутри они (как?) Не значимы % %.
Тед Хопп,
Конечное пространство также важно. Извините за редактирование, я думал, ваш представитель сказал 270, а не 270k ... ой. Я часто редактирую ответы, когда представитель подсказывает, что пользователь не вернется. Очевидно, здесь не так. Виноват.
chappjc
@chappjs нет проблем, спасибо за редактирование! Не знаю, как я это пропустил.
Пекка
4

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

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

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

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
dgo
источник