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

问题描述 投票:0回答:3

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

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

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来看,它应该回显变量的内容。发生什么事了?

windows batch-file cmd filesize
3个回答
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%%
,但遗憾的是随后重置错误级别。


0
投票
尝试此打印一个或多个文件的文件大小。我制作了一个

子例程,使编写复杂的代码块变得更容易。如果您需要两个命名文件,请使用精确的 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
    

0
投票
@echo off =;( for /f %%G in =;(' 2^>nul "%__AppDir__%where.exe" .:"flava.jpg" /t ');= do echo/%%~G && set "_FileSize=%%~G" );= =||= echo/File not found.


单个循环已经获取了文件大小,它定义了大小变量并响应其存在。如果没有文件,它已经响应其不存在而无需定义变量。

© www.soinside.com 2019 - 2024. All rights reserved.