setlocal enabledelayedexpansion
IF EXIST "flava.jpg" (
REM Get current filesize
FOR /F %%A in ("flava.jpg") DO SET _existingFileSize=%%~zA
ECHO !_existingFileSize!
) ELSE (
ECHO File not found.
)
или
IF EXIST "flava.jpg" (
REM Get current filesize
FOR /F %%A in ("flava.jpg") DO SET _existingFileSize=%%~zA
CALL ECHO %%_existingFileSize%%
) ELSE (
ECHO File not found.
)
или
set "_existingfilesize="
FOR /F %%A in ("flava.jpg") DO SET _existingFileSize=%%~zA
if defined _existingfilesize (echo %_existingfilesize%) else (echo file not found)
Вопрос заключается в том, что в пределах оператора блока (a parenthesised series of statements)
, блок вся анализируется и затем выполняется. Любой %var%
в блоке будет заменен значением этой переменной на момент анализа блока - до того, как блок будет выполнен - то же самое относится к FOR ... DO (block)
.
Следовательно, IF (something) else (somethingelse)
будет выполнен с использованием значений %variables%
в момент возникновения ошибки IF
.
Два распространенный способ преодоления этого является: 1) использовать setlocal enabledelayedexpansion
и использовать !var!
вместо %var%
, чтобы получить доступ к измененному значению var
или 2) для вызова подпрограммы, чтобы выполнить дальнейшую обработку с использованием измененных значений.
Обратите внимание, что использование CALL ECHO %%var%%
отображает измененное значение var
. CALL ECHO %%errorlevel%%
отображает, но, к сожалению, RESETS errorlevel.
Пожалуйста, покажите код в контексте. Я считаю, что у вас, вероятно, есть «for» и следующее «echo» в «блоке кода» (заключенная в скобки серия инструкций) - пожалуйста, отредактируйте свой вопрос, чтобы включить весь блок кода (от инициирующего 'for' или' if' to finl close ')' – Magoo
@Magoo Вместо того, чтобы подавить, я поставил наименьший бит кода, который все еще реплицирует проблему, которую я имею. (Протестировано на моей машине и все еще имеет ту же проблему.) –