Trong một tuyên bố khối (a parenthesised series of statements)
, khối toàn bộ được phân tách và sau đó thực thi. Bất kỳ %var%
trong khối sẽ được thay thế bằng giá trị của biến đó tại thời điểm khối được phân tích cú pháp - trước khi khối được thực hiện - điều tương tự cũng áp dụng cho một FOR ... DO (block)
.
Do đó, IF (something) else (somethingelse)
sẽ được thực hiện bằng cách sử dụng các giá trị %variables%
tại thời điểm IF
gặp phải.
Hai cách phổ biến để khắc phục điều này là 1) để sử dụng setlocal enabledelayedexpansion
và sử dụng !var!
ở vị trí của %var%
để truy cập giá trị thay đổi của var
hoặc 2) để gọi một chương trình con để thực hiện tiếp tục xử lý bằng cách sử dụng các giá trị thay đổi.
Lưu ý do đó việc sử dụng CALL ECHO %%var%%
hiển thị giá trị thay đổi là var
.
Mã của bạn chứa hai biến riêng biệt được gọi là f
.
Đầu tiên là điều khiển vòng lặp 'có thể biến đổi' được gọi là f
và được tham chiếu bởi %%f
.
Biến thứ hai là biến môi trường chung f
được thiết lập theo tuyên bố set "f=..."
.Biến này có thể được truy cập bằng cách sử dụng %f%
nhưng trong một block
, nó sẽ xuất hiện để giữ lại giá trị của nó có khi kiểm soát for
được phân tích cú pháp (trên thực tế, bất kỳ %var%
được thay thế tại phân tích thời gian bởi giá trị của var
ở đó Hiện)
metavariables
không thể được sử dụng trong báo cáo chuỗi thao tác như chuỗi con hoặc sản phẩm thay thế, chỉ có các biến môi trường chung có thể được sử dụng cho các hoạt động này, do đó bạn cần phải gán giá trị của metavariable f
vào biến môi trường f
và sau đó thực hiện tác vụ thay thế chuỗi biến môi trường f
.
Biến đổi, tất nhiên, là bạn phải sử dụng delayedexpansion
và cú pháp !var!
để truy cập giá trị được sửa đổi của biến môi trường trong một khối.
Vì vậy,
setlocal enabledelayedexpansion
for...%%f...do (
echo %%f
set "f=%%f"
set "f=!f:\=/!"
echo !f!
)
echo just for demonstration %f% !f! %%f
này đặt giá trị của f
theo cách thức yêu cầu (tất nhiên, bạn luôn có thể thay đổi tên để tránh nhầm lẫn ...)
Dòng cuối cùng chỉ đơn giản là để cho thấy giá trị cuối cùng được mua bởi f
có thể được truy cập bên ngoài vòng lặp dưới dạng %f%
hoặc !f!
và rằng %%f
nằm ngoài ngữ cảnh và được hiển thị là %f
.
Một cách khác để làm điều này mà không delayedexpansion
là
for...%%f...do (
echo %%f
set "f=%%f"
call set "f=%%f:\=/%%"
call echo %%f%%
)
echo just for demonstration %f% !f! %%f
sự khác biệt là việc sử dụng các call
và tăng gấp đôi %
s, và dòng cuối cùng sẽ hiển thị !f!
như điều đó - một chữ, vì ngoài delayedexpansion
chế độ, !
chỉ là một ký tự khác không có ý nghĩa đặc biệt đối với cmd
.
Câu hỏi này có cùng một giải pháp [Làm thế nào để bạn xác định tên người dùng trong upload ftp bởi một tập tin hàng loạt] (http://stackoverflow.com/questions/23535640/how-do-you-specify-the-username-in-ftp-upload-by-a-batch-file) – jeb
Bạn có chắc chắn về giải pháp nằm trong câu hỏi bạn đã liên kết đến ? Tôi không thấy câu trả lời, và họ trông giống như những câu hỏi khác nhau với tôi. – user3253319
Xin lỗi, bạn đã đúng. Ý tôi là [BATCH - Thay thế khoảng trống trong tên tệp với% 20 cho curl] (http://stackoverflow.com/questions/23538894/batch-replacing-spaces-in-filename-with-20-for-curl) – jeb