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


88

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

set FOO=bar

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


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%

11

другой метод

@Echo oFF

setlocal
set FOO=bar
echo %FOO%
endlocal

echo %FOO%

pause

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.