Следующий код не обновляет Выполнение для равенства 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"
)
)
Вам нужно использовать опцию отложенного расширения 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!
работает, так как это оценивалось каждый раз по циклу.