2016-04-10 2 views
0

Я пытаюсь написать простой командный файл, который позволяет мне сравнивать два файла, в которых оба имени файла уже известны и заданы в самом пакетном файле.Получение файла в пакетном файле, где известно имя файла

Но просто получить один файл нелегко. Вот маленький кусок кода, который воспроизводит проблему:

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. 

) 

Из того, что я прочитал here, он должен повторить содержимое переменной. Что происходит?

+0

Пожалуйста, покажите код в контексте. Я считаю, что у вас, вероятно, есть «for» и следующее «echo» в «блоке кода» (заключенная в скобки серия инструкций) - пожалуйста, отредактируйте свой вопрос, чтобы включить весь блок кода (от инициирующего 'for' или' if' to finl close ')' – Magoo

+0

@Magoo Вместо того, чтобы подавить, я поставил наименьший бит кода, который все еще реплицирует проблему, которую я имею. (Протестировано на моей машине и все еще имеет ту же проблему.) –

ответ

3
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.

+0

Фантастический образовательный ответ! Достаточно информации для меня, чтобы решить эту проблему самостоятельно. Большое спасибо! –

0

Попробуйте распечатать файл из одного или нескольких файлов. Я сделал подпрограмму , что упростило запись сложных блоков кода. Если вам нужны два именованных файла, используйте точные файл значений.

@echo off 
set file=*.bat 
for %%A in (%file%) do call :DOIT %%A 
goto :END 

:DOIT 
echo %1 size is %~z1 
goto :EOF 

:END 
pause 
+0

Нет необходимости в подпрограмме. Вместо этого вы можете просто «%% ~ zA». – Joey

+0

@Joey Не могли бы вы объяснить дальше? Благодарю. Я действительно не могу понять, что не так с моим кодом :( –