在文件名已知的批处理文件中获取文件大小
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%%
显示,但遗憾的是随后重置错误级别。
我正在尝试编写一个简单的批处理文件,它允许我比较两个文件大小,其中两个文件名都是已知的并在批处理文件本身中设置。
但事实证明,仅仅获得一个文件大小是很困难的。这是复制问题的最小代码片段:
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%%
显示,但遗憾的是随后重置错误级别。