在文件名已知的批处理文件中获取文件大小

Getting a filesize in a batch file where the filename is known

我正在尝试编写一个简单的批处理文件,它允许我比较两个文件大小,其中两个文件名都是已知的并在批处理文件本身中设置。

但事实证明,仅仅获得一个文件大小是很困难的。这是复制问题的最小代码片段:

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,它应该与变量的内容相呼应。怎么回事?

试试这个来打印一个或多个文件的文件大小。我做了一个 子程序 使编写复杂的代码块变得更容易。如果您需要两个命名文件,请使用精确的 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
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) 中,entire 块被解析并执行 then。块中的任何 %var% 将被该变量的值替换 在块被解析时 - 在执行块之前 - 同样的事情适用于 FOR ... DO (block).

因此,IF (something) else (somethingelse) 将在遇到 IF 时使用 %variables% 的值执行。

克服此问题的两种常见方法是 1) 使用 setlocal enabledelayedexpansion 并使用 !var! 代替 %var% 来访问 var 的更改值或 2)调用子例程以使用更改后的值执行进一步处理。

因此请注意 CALL ECHO %%var%% 的使用,它显示 var 的更改值。 CALL ECHO %%errorlevel%% 显示,但遗憾的是随后重置错误级别。