hàng loạt cửa sổ SET bên trong NẾU không hoạt động


102

khi tôi đang chạy tập lệnh này (từ tệp .bat):

set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo %var2%
)

Tôi luôn nhận được:

ECHO is on.

Có nghĩa là var2biến không thực sự được đặt. Bất cứ ai có thể xin vui lòng giúp tôi hiểu tại sao?

Câu trả lời:


184

var2 được thiết lập, nhưng sự mở rộng trong dòng echo %var2%xảy ra trước khi khối được thực thi.
Tại thời điểm var2này là trống rỗng.

Do đó, cú pháp delayExpansion tồn tại, nó sử dụng !thay vì %và nó được đánh giá tại thời điểm thực thi, không phải thời gian phân tích cú pháp.

Xin lưu ý rằng để sử dụng !, setlocal EnableDelayedExpansioncần có bản khai bổ sung .

setlocal EnableDelayedExpansion
set var1=true
if "%var1%"=="true" (
  set var2=myvalue
  echo !var2!
)

11
Cảm ơn bạn đã bỏ qua cho tôi một nỗi đau rất lớn.
Myna

Cùng một quy tắc đối với &và các &&toán tử. Mã này set x=some & set y=%x%thing & echo results %y%xuất ra %x%thing.
gwarah

13

Tôi đến bữa tiệc hơi muộn nhưng một cách khác để giải quyết tình trạng này là tiếp tục xử lý bên ngoài if, như thế này

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
)
echo %var2%

Hoặc / và sử dụng gotocú pháp

set var1=true
if "%var1%"=="true" (
    set var2=myvalue
    goto line10
) else (
    goto line20
)
. . . . .
:line10
echo %var2%
. . . . . 
:line20

Bằng cách này, việc mở rộng xảy ra "đúng lúc" và bạn không cần setlocal EnableDelayedExpansion. Tóm lại, nếu bạn suy nghĩ lại về thiết kế tập lệnh của mình, bạn có thể làm như vậy


Tôi không thể truy cập biến mà tôi đã tạo bên trong câu lệnh if. Ví dụ đầu tiên của bạn với var2 không hoạt động.
AntonioCS

@AntonioCS thú vị ... đây là tập lệnh chính xác mà tôi vừa thử nghiệm echo off set var1=true if "%var1%"=="true" ( set var2=myvalue ) echo %var2% pause.. và nó đang hoạt động. "nếu bạn sẽ tạo một biến trong tệp loạt mà nó có thể được truy cập ở bất kỳ đâu trong chương trình." . aticleworld.com/batch-file-variables-and-scope
TS
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.