我正在尝试编写一个简单的批处理文件,该文件允许我比较两个文件大小,其中两个文件名都是已知的并在批处理文件本身中设置。
但是事实证明,仅仅获得一种文件大小是很困难的。这是复制问题的最小代码:
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来看,它应该回显变量的内容。发生什么事了?
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%%
,但遗憾的是随后重置错误级别。
子例程,使编写复杂的代码块变得更容易。如果您需要两个命名文件,请使用精确的 file 值。
@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
@echo off
=;( for /f %%G in =;(' 2^>nul "%__AppDir__%where.exe" .:"flava.jpg" /t
');= do echo/%%~G && set "_FileSize=%%~G" );= =||= echo/File not found.