Як визначити змінну 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, а не 270 000 ... ой. Я часто редагую відповіді, коли представник припускає, що користувач не повертається. Очевидно, не тут справа. Моя помилка.
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.