Tôi có hai ví dụ về các tệp bó rất đơn giản:
Gán một giá trị cho một biến:
@echo off
set FOO=1
echo FOO: %FOO%
pause
echo on
Mà, như mong đợi, kết quả trong:
FOO: 1
Press any key to continue . . .
Tuy nhiên, nếu tôi đặt hai dòng giống nhau bên trong một khối NẾU KHÔNG ĐƯỢC ĐỊNH NGH: A:
@echo off
IF NOT DEFINED BAR (
set FOO=1
echo FOO: %FOO%
)
pause
echo on
Điều này bất ngờ dẫn đến:
FOO:
Press any key to continue . . .
Điều này không liên quan gì đến IF, rõ ràng khối đang được thực thi. Nếu tôi xác định BAR ở trên if, chỉ văn bản từ lệnh PAUSE được hiển thị, như mong đợi.
Đưa cái gì?
Câu hỏi tiếp theo: Có cách nào để kích hoạt mở rộng bị trì hoãn mà không cần setlocal không?
Nếu tôi gọi tệp bó ví dụ đơn giản này từ bên trong tệp khác, ví dụ sẽ đặt FOO, nhưng chỉ LỘC.
Ví dụ:
testcaller.bat
@call test.bat
@echo FOO: %FOO%
@pause
kiểm tra
@setlocal EnableDelayedExpansion
@IF NOT DEFINED BAR (
@set FOO=1
@echo FOO: !FOO!
)
Điều này hiển thị:
FOO: 1
FOO:
Press any key to continue . . .
Trong trường hợp này, có vẻ như tôi phải kích hoạt mở rộng bị trì hoãn trong CALLER, điều này có thể gây rắc rối.
!
, sử dụng^^^!
(thoát nó hai lần). Nếu không, tính năng "mở rộng bị trì hoãn" sẽ ăn nó.