Jak cofnąć definicję zmiennej MS-DOS?

88

Powiedzmy, że wykonuję następujące czynności w powłoce CMD:

set FOO=bar

Czy istnieje sposób na cofnięcie definicji tej zmiennej, inny niż recykling powłoki CMD?

user288004
źródło
9
Czy naprawdę masz na myśli MS-DOS (który był martwy przez co najmniej 10 lat) - czy też mówisz MS-DOS, ale naprawdę masz na myśli wiersz poleceń Windows ( cmd.exe)?
marc_s
4
Prawdopodobnie, ale to nie ma znaczenia w przypadku tego pytania ...
Duch Madary
3
Marc ma rację. To nie jest powłoka MS-DOS. Ludzie nigdy nie dowiadują się, że to duża różnica.
Michael-O
@MadaraUchiha, Rzeczywiście, twoja set var=odpowiedź działa pod MS-DOS 6.22 command.com tak samo, jak działa pod Windows cmd.exe. (Jednak, w przeciwieństwie do Windows, umieszczenie w cudzysłowie var = nie działa, zamiast tego tworzy zmienną środowiskową, którego nazwa zaczyna się podwójnym cudzysłowem.)
Simon Kissane

Odpowiedzi:

136

Tak, możesz to wyłączyć za pomocą

set FOO=

Lub jawnie używając:

set "FOO="

Upewnij się, że po =znaku nie występują żadne dodatkowe (niewidoczne) znaki końcowe . To jest:

  • set FOO=różni się od set FOO=      .
Duch Madary
źródło
29

Bezpiecznym sposobem usunięcia zmiennej jest użycie również cudzysłowów, wtedy nie ma problemów ze spacjami końcowymi.

set FOO=bar
echo %FOO%
set "FOO=" text after the last quote is ignored
echo %FOO%
jeb
źródło
11

inna metoda

@Echo oFF

setlocal
set FOO=bar
echo %FOO%
endlocal

echo %FOO%

pause

Uwaga: to nie zadziała w interaktywnym wierszu polecenia. Ale działa w skrypcie wsadowym.

walid2mi
źródło
9

To działa dla mnie w mojej powłoce CMD systemu Windows 7:

set FOO=bar
echo %FOO% // bar
set FOO=
echo %FOO% // empty; calling "set" no longer lists it
Pekka
źródło
2
W setpoleceniu znaczące są spacje . Jeśli spróbujesz, set FOO = bara następnie spróbujesz set FOO=, nie spowoduje to usunięcia „FOO”. Jednak z jakiegoś powodu nie są (jak?) Znaczące w środku % %.
Ted Hopp
Ważna jest również spacja końcowa. Przepraszam za zmianę, myślałem, że twój przedstawiciel powiedział 270, a nie 270 000 ... ups. Często edytuję odpowiedzi, gdy przedstawiciel sugeruje, że użytkownik nie wraca. Oczywiście nie w tym przypadku. Mój błąd.
chappjc
@chappjs nie ma problemu, dzięki za edycję! Nie wiem, jak to przegapiłem.
Pekka,
4

Przedstawiłbym następujące uwagi tylko jako komentarz, ale myślę, że jest to wystarczająco ważne, aby stanąć samodzielnie.

Wiele z poprzednich odpowiedzi wspominało, że należy uważać na spacje końcowe; i na pewno to prawda. Jednak odkryłem, że czasami końcowe spacje chcą się tam dostać bez względu na wszystko - szczególnie jeśli robisz jednowierszowy wiersz poleceń i potrzebujesz spacji jako separatora poleceń.

Oto rozwiązanie tego problemu:

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

Dzięki zawijaniu deklaracji w podwójne cudzysłowy w ten sposób można całkowicie uniknąć problemu z odstępami. Może to być również bardzo przydatne, gdy zmienne są tworzone przez konkatenację w celu wyeliminowania spacji między - na przykład - ścieżkami, np .:

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