2009-12-30 129 views
10

以下代碼未更新即使匹配發生,但仍運行爲等於N.這意味着我不會掉入CALL代碼。我在這裏錯過了什麼嗎?批處理文件無法在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" 
    ) 
) 

回答

18

您需要使用cmd.exe的延遲擴展選項。

在腳本的頂部,放:

setlocal enableextensions enabledelayedexpansion 

然後放:

endlocal 

在底部。您需要使用!Run!而不是%Run%

您的代碼不起作用的原因在於,在遇到它時,會評估FOR語句(包括其中的命令)的整個整個。這就是%Run%變量的擴展點。

通過使用延遲擴展,您不會擴展它們直到它們實際需要(在塊中設置它們之後)。

你可以看到這個劇本的區別:

@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 

,輸出:

a 
b 
c 
yes for delayed 
d 

你會發現,與%xx%檢查不起作用,因爲這是評估當for聲明開始(並且xx爲0)。延遲擴展!xx!確實工作,因爲每次通過循環評估。

+0

謝謝paxdiablo,完全排序我的問題 – sapatos 2009-12-30 05:08:07

相關問題