пакетному файлу не удается установить переменную в Выражении if

Следующий код не обновляет Выполнение для равенства N даже при том, что соответствие происходит. это означает, что я не заскакиваю в код ВЫЗОВА. Я пропускаю что-то здесь?

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"
    )   
)
10
задан Jon Seigel 7 March 2010 в 18:11
поделиться

1 ответ

Вам нужно использовать опцию отложенного расширения cmd.exe.

В верхней части вашего скрипта поставьте:

setlocal enableextensions enabledelayedexpansion

и затем поставьте:

endlocal

внизу.

Затем вам нужно использовать !Бегите! вместо %Run%.

Причина, по которой ваш код не работает, заключается в том, что оператор whole 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% не работает, потому что это было оценено, когда для оператор начал (и xx было 0). Расширение с задержкой !xx! работает, так как это оценивалось каждый раз по циклу.

.
18
ответ дан 3 December 2019 в 20:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: