2014-10-15 13 views
5

Tôi đặt biến trong CMD trên Windows 8.1 bằng lệnh set và cố gắng lặp lại biến đó.Tại sao không có đầu ra chuỗi với 'echo% var%' sau khi sử dụng 'set var = text' trên dòng lệnh?

Dưới đây là một ví dụ:

C:\Users\Logan>set var = text 

C:\Users\Logan>set var 
var = text 

C:\Users\Logan>echo %var% 
%var% 

C:\Users\Logan> 

Vậy là có một cách để buộc các dấu nhắc lệnh để echo biến, không phải là văn bản thô?

Trả lời

3

Bạn cần phải mang lại gần hơn văn bản của bạn từ các biểu tượng bằng nhau:

set var=text 
echo %var% 
text 
+0

Ok, nó hoạt động, nhưng tại sao? Bạn cũng có thể sử dụng 'set/p' với điều này? – Logern

+1

@Logern Khi bạn thực hiện 'set var = text', bạn đang tạo một biến có tên' var '(chú ý khoảng trắng sau dấu r). – aphoria

13

Gán một giá trị/chuỗi đến một biến môi trường

Với phần mở rộng lệnh kích hoạt như mặc định tốt nhất là sử dụng:

set "var=text" 

Lệnh này là đặt và thông số là "variable=value".

Chuỗi tham số có thể được đặt trong dấu ngoặc kép như trên tất cả các lệnh miễn là mở rộng lệnh được bật theo mặc định.

Nếu dấu ngoặc kép không được sử dụng xung quanh variable=value, lệnh thiết giải thích tất cả mọi thứ đến cuối dòng sau dấu bằng đầu tiên bao gồm cả không gian có thể nhìn thấy và các tab ngang ở cuối dòng như chuỗi giá trị để gán cho biến.

Tên của biến bắt đầu bằng ký tự khoảng trắng đầu tiên (sau dấu ngoặc kép nếu được sử dụng) và kết thúc từ trái sang dấu bằng đầu tiên. Giá trị được gán cho biến bắt đầu ngay từ dấu bằng đầu tiên và kết thúc ở cuối dòng hoặc dấu ngoặc kép cuối cùng.

set VAR = TEXT 

tạo ra một biến môi trường với tên VARSpace và gán chuỗi SpaceTEXT để biến này.

Cũng sử dụng

set var="text" 

thường là không đúng vì điều này dẫn đến gán cho biến var văn bản bằng dấu ngoặc kép bao gồm và tất cả các dấu không gian và các tab. Tham chiếu bây giờ var trên một dòng mã khác với dấu ngoặc kép xung quanh thường dẫn đến một thông báo lỗi khi biến giữ chính nó văn bản đã có dấu ngoặc kép. Để biết thêm chi tiết xem câu trả lời trên How to set environment variables with spaces?

Ví dụ:

@echo off 
setlocal 
set "var=text" 
set "var = text" 
set "var1=and more text" 
set var2="and more text" 
set var3="text with 1 trailing space" 
set var 
echo var3=%var3%^<- Do you see the trailing space? 
echo/ 
set UnwantedSpaceVar=Hello 
echo %UnwantedSpaceVar%! ^<- Where does the space come from? 
echo/ 
echo There is a trailing space after Hello in this code snippet. 
echo/ 
set "TrailingSpacesIgnored=Hi" 
echo %TrailingSpacesIgnored%! ^<- The 3 trailing spaces above are ignored. 
echo/ 
endlocal 
pause 

Chạy này nhỏ kết quả mã batch trong đầu ra:

var=text 
var = text 
var1=and more text 
var2="and more text" 
var3="text with 1 trailing space" 
var3="text with 1 trailing space" <- Do you see the trailing space? 

Hello ! <- Where does the space come from? 

There is a trailing space after Hello in this code snippet. 

Hi! <- The 3 trailing spaces above are ignored. 

Kèm theo variable=value trong dấu ngoặc kép có thể được thực hiện ngay cả khi văn bản chính nó chứa 1 hoặc nhiều dấu ngoặc kép.

set "Quote="" 

Dòng này xác định biến Quote với giá trị ". Lệnh đặt diễn giải mọi thứ sau dấu bằng đầu tiên trái sang dấu ngoặc kép cuối cùng làm giá trị để gán cho biến có tên giữa dấu đầu tiên và dấu bằng đầu tiên.

phân Variable với phần mở rộng lệnh tàn tật

Lệnh cú pháp set "variable=value" không thể được sử dụng nếu các phần mở rộng lệnh bị vô hiệu hóa với setlocal DisableExtensions trong file batch (hoặc trong Windows registry mà là rất phổ biến và không bao giờ nhìn thấy tôi trên bất kỳ Windows máy vi tính). Lỗi cú pháp sẽ là kết quả của việc thực thi tệp lô.

Chỉ có thể sử dụng set variable=value với các tiện ích mở rộng lệnh bị vô hiệu hóa theo đó giá trị cũng có thể chứa dấu ngoặc kép và cẩn thận khi được gán cho biến môi trường.

Chạy trong cửa sổ nhắc lệnh cmd /?setlocal /? để biết thêm thông tin về tiện ích mở rộng lệnh và lệnh nào bị ảnh hưởng bởi tiện ích mở rộng lệnh. Lưu ý: danh sách đầu ra của lệnh bị ảnh hưởng nhớ thoát như mô tả trong câu trả lời về Where does GOTO :EOF return to?

phân Variable qua biểu thức số học

Sử dụng lệnh thiết với tùy chọn /A thay đổi hoàn toàn các phân tích của số thứ hai, tức là chuỗi sau set /A. Với tùy chọn /A làm đối số đầu tiên, chuỗi thứ hai được hiểu là biểu thức số học và do đó được xử lý hoàn toàn khác với việc chỉ định giá trị chuỗi cho biến môi trường. Biến môi trường luôn luôn là chuỗi kiểu và không bao giờ là số nguyên.

Việc sử dụng tùy chọn /A yêu cầu tiện ích mở rộng lệnh đã bật nếu không lệnh đặt bỏ qua toàn bộ dòng hoàn toàn mà không có bất kỳ thông báo lỗi nào. Trong hầu hết các trường hợp, không nên chỉ định một số cho biến môi trường sử dụng biểu thức số học, tức là sử dụng set /A var=1. set "var=1" hoặc chỉ set var=1 (và không có khoảng trống cuối) nhanh hơn một chút vì các biến môi trường luôn là chuỗi loại.

Trong biểu thức số học, khoảng trắng được hiểu là dấu phân cách cho tên biến, số và toán tử. Vì lý do đó dòng lệnh set /A var = 1không định nghĩa một biến với tên VARSpace với chuỗi Space như set var = 1 làm. set /A var = 1 định nghĩa một biến với tên VAR với giá trị chuỗi sau khi chuyển đổi 1 từ chuỗi (batch file chứa 1 như nhân vật với giá trị mã thập lục phân 31) để nguyên với giá trị 1 và trở lại một chuỗi với hai giá trị 0x31 và 0x00 (chuỗi chấm dứt null).

phân Variable qua một dấu nhắc

Ngoài cách sử dụng lệnh thiết với tùy chọn /P thay đổi phân tích của chuỗi sau tên biến và dấu bằng. Chuỗi sau tên biến và dấu bằng được hiểu là văn bản nhắc đến đầu ra chứ không phải là chuỗi để gán cho biến môi trường.

Các biến môi trường được giao chuỗi nhập vào bởi người sử dụng nhắc nhở (hoặc chuyển hướng từ một tập tin hoặc lệnh/ứng dụng), hoặc trong trường hợp người dùng không nhập bất cứ điều gì trước khi nhấn RETURN hay ENTER, giữ giá trị hiện tại của nó tương ứng vẫn chưa được xác định nếu không được xác định trước dấu nhắc.

Cách sử dụng tùy chọn /P yêu cầu tiện ích mở rộng lệnh đã bật nếu không lệnh đặt bỏ qua toàn bộ dòng hoàn toàn mà không có bất kỳ thông báo lỗi nào.

sử dụng Hầu hết các cú pháp cho khiến một người dùng cho một chuỗi là:

set /P var="Please enter something: " 

Lệnh thiết loại bỏ trong trường hợp này tự động trong ngoặc kép quanh các văn bản nhắc nhở trước khi in để xử lý STDOUT (giao diện điều khiển cửa sổ nếu không được chuyển hướng).

Nhưng làm việc cũng là:

set /P "var=Please enter something: " 

Vui lòng đọc this answer để biết thêm chi tiết về phân tích cú pháp văn bản nhắc nhở và làm thế nào để ra một văn bản nhắc nhở với xung quanh dấu ngoặc kép.

+0

1. Đối với cú pháp 'set" VAR = Text "' bạn nên đề cập rằng điều này chỉ hoạt động trong trường hợp các mở rộng lệnh được kích hoạt (xem thêm 'cmd /?' Và 'setlocal /?'). 2. Đối với 'set/P', cú pháp tốt nhất thực sự là' set/P VAR = "Hãy nhập một cái gì đó:" ', bởi vì trong trường hợp văn bản nhắc bắt đầu bằng dấu ngoặc kép, cú pháp' set/P "VAR = "bị cấm:" có thể dẫn đến kết quả không mong muốn, trong khi 'set/P VAR =" "bị cấm:" 'không. – aschipfl

Các vấn đề liên quan