2009-12-30 34 views
10

Mã sau không cập nhật Chạy bằng N ngay cả khi kết quả trùng khớp xảy ra. điều này có nghĩa là tôi không rơi vào mã CALL. Am i thiếu cái gì ở đây?tệp lô không thể đặt biến trong mệnh đề IF

SET Run=Y 

REM Check current files date/time information and establish if the file has been present too long in the directory 
REM Skip first 4 lines as header information not required 

FOR /f "tokens=1-5 skip=4 delims= " %%G IN ('dir /OD "%SRCH_CRITERIA% "') DO (

    ECHO "Params to processFile: " %%G %%H %%I ""%%K"" 
    IF %%K.==. ( 
     ECHO "K:nothing" 
     SET Run=N 
     ECHO %Run% 
    ) 

    IF %%K==free (
     ECHO "K:FREE" 
     SET Run=N 
     ECHO %Run% 
    ) 

    ECHO %Run% RUN 
    IF %Run%=="Y" (
     CALL :processFile "%%G" "%%H" "%%I" "%%K" 
    ) 
) 

Trả lời

18

Bạn cần sử dụng tùy chọn mở rộng chậm của cmd.exe.

Ở phía trên cùng của kịch bản của bạn, hãy đặt:

setlocal enableextensions enabledelayedexpansion 

và sau đó đặt:

endlocal 

ở phía dưới.

Sau đó, bạn cần sử dụng !Run! thay vì %Run%.

Lý do mã của bạn không hoạt động là toàn bộ câu lệnh FOR (bao gồm các lệnh trong đó) được đánh giá khi gặp phải. Đó là điểm mà các biến số %Run% được mở rộng.

Bằng cách sử dụng mở rộng hoãn lại, bạn không mở rộng chúng cho đến khi chúng thực sự cần thiết (sau khi bạn đã đặt chúng trong khối).

Bạn có thể thấy sự khác biệt trong kịch bản này:

@echo off 
setlocal enableextensions enabledelayedexpansion 

set xx=0 
for %%i in (a b c d) do (
    echo %%i 
    set /a "xx = xx + 1" 
    if %xx%==3 echo yes for normal 
    if !xx!==3 echo yes for delayed 
) 

endlocal 

mà kết quả đầu ra:

a 
b 
c 
yes for delayed 
d 

Bạn sẽ nhận thấy rằng việc kiểm tra với %xx% không hoạt động bởi vì đó được đánh giá khi tuyên bố for đã bắt đầu (và xx là 0). Việc mở rộng chậm !xx!thực hiện công việc vì việc này được đánh giá mỗi lần qua vòng lặp.

+0

Cảm ơn paxdiablo, đã phân loại hoàn toàn vấn đề của tôi – sapatos

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