Làm cách nào để hủy xác định một biến MS-DOS?


88

Giả sử tôi thực thi những điều sau trong CMD shell:

set FOO=bar

Có cách nào để hủy xác định biến này, ngoài việc tái chế CMD shell không?


9
Bạn thực sự muốn nói đến MS-DOS (đã chết ít nhất 10 năm hoặc lâu hơn) - hay bạn nói MS-DOS nhưng thực sự có nghĩa là dòng lệnh Windows ( cmd.exe) ??
marc_s

4
Có khả năng, nhưng nó không thực sự quan trọng cho câu hỏi đó ...
ma của Madara

3
Marc nói đúng. Đây không phải là MS-DOS shell. Mọi người không bao giờ biết rằng đây là một sự khác biệt lớn.
Michael-O

@MadaraUchiha, Thật vậy, set var=câu trả lời của bạn hoạt động trong MS-DOS 6.22 command.com giống như nó hoạt động trong Windows cmd.exe. (Tuy nhiên, không giống như Windows, đặt dấu ngoặc kép quanh var = không làm việc, thay vào đó nó sẽ tạo ra một biến môi trường có tên bắt đầu với một dấu nháy kép.)
Simon Kissane

Câu trả lời:


136

Có, bạn có thể hủy đặt nó bằng

set FOO=

Hoặc sử dụng rõ ràng:

set "FOO="

Đảm bảo không có ký tự không liên quan (ẩn) ở sau =dấu hiệu. Đó là:

  • set FOO=khác với set FOO=      .

29

Một cách an toàn để bỏ đặt biến là sử dụng cả dấu ngoặc kép, khi đó không có vấn đề gì với dấu cách ở cuối.

set FOO=bar
echo %FOO%
set "FOO=" text after the last quote is ignored
echo %FOO%

11

Một phương pháp khác

@Echo oFF

setlocal
set FOO=bar
echo %FOO%
endlocal

echo %FOO%

pause

Lưu ý: Điều này sẽ không hoạt động trên một dấu nhắc lệnh tương tác. Nhưng hoạt động trong tập lệnh hàng loạt.


9

Điều này phù hợp với tôi trong trình bao Windows 7 CMD của tôi:

set FOO=bar
echo %FOO% // bar
set FOO=
echo %FOO% // empty; calling "set" no longer lists it

2
Dấu cách có ý nghĩa trong setlệnh. Nếu bạn thử set FOO = barvà sau đó thử set FOO=, nó sẽ không bỏ đặt 'FOO'. Tuy nhiên, vì một số lý do, chúng không (như?) Đáng kể bên trong % %.
Ted Hopp

Khoảng trống sau cũng rất quan trọng. Xin lỗi vì đã chỉnh sửa, tôi nghĩ đại diện của bạn nói 270, không phải 270k ... oops. Tôi thường chỉnh sửa câu trả lời khi đại diện gợi ý rằng người dùng không quay lại. Rõ ràng không phải trường hợp ở đây. Lỗi của tôi.
chappjc

@chappjs không sao, cảm ơn bạn đã chỉnh sửa! Không chắc làm thế nào tôi đã bỏ lỡ điều đó.
Pekka

4

Tôi chỉ đưa ra những điều sau đây như một nhận xét, nhưng tôi nghĩ nó đủ quan trọng để tự đứng vững.

Rất nhiều câu trả lời trước đây đã đề cập rằng người ta cần phải cẩn thận với dấu cách ở cuối; và chắc chắn đó là sự thật. Tuy nhiên, tôi nhận thấy rằng đôi khi các dấu cách ở cuối chỉ muốn đi vào đó bất kể điều gì - đặc biệt nếu bạn đang thực hiện dòng lệnh một dòng và cần khoảng trắng làm dấu phân cách lệnh.

Đây là giải pháp cho vấn đề đó:

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

Bằng cách gói khai báo trong dấu ngoặc kép theo cách đó, vấn đề khoảng cách có thể được tránh hoàn toàn. Điều này cũng có thể thực sự hữu ích khi các biến được tạo bằng cách nối để loại bỏ khoảng trắng ở giữa - ví dụ - các đường dẫn, ví dụ:

SET A=c:\users\ && SET D=Daniel
SET P="%a%%d%"
ECHO %P%
:: outputs "C:\Users\ Daniel"
:: Notice the undesirable space there
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.