set /a nFileSize=0
(
call :getFileSize D:\test1\sendszl2data\20111031\SZSEL2-20111031.tar.gz
echo %nFileSize%
)
(
call :getFileSize D:\test1\sendszl2data\20111031\SZSEL2-20111031.tar.gz
echo %nFileSize%
)
pause
:获取指定文件的大小
:getFileSize
@echo off
set strFilePath=%1%
set /a nFileSize=0
for /f "delims=" %%i in ('dir %strFilePath% /s/b') do set /a nFileSize=%%~zi
echo %nFileSize%
goto :EOF
这是test.bat
运行结果:
D:\test1\sendszl2data>set /a nFileSize=0
D:\test1\sendszl2data>(
call :getFileSize D:\test1\sendszl2data\20111031\SZSEL2-20111031.tar.gz
echo 0
)
552814
0
552814
552814
请按任意键继续. . .
为什么第1次的结果不对啊?
bat
------解决方案--------------------
是这样的:
(
call :getFileSize D:\test1\sendszl2data\20111031\SZSEL2-20111031.tar.gz
echo %nFileSize%
)
批处理的解释器每次读入一个逻辑块,进行解析,其中包括变量替换。
一个逻辑块包括包含一个语句的一行命令,或者一个for语句,或者一个括号内语句,或者别的我不可能列举全。
你上面的代码包在一个括号中,因此解释器一次性读入它,并且将%nFileSize%进行替换,此时它的值是0(注意此时读进去的语句还没有开始执行,所以%nFileSize%的值是0),那么echo出来的就是0
解决办法是使用变量延迟:
set /a nFileSize=0
SETLOCAL EnableDelayedExpansion
(
call :getFileSize D:\test1\sendszl2data\20111031\SZSEL2-20111031.tar.gz
echo !nFileSize!
)
(
call :getFileSize D:\test1\sendszl2data\20111031\SZSEL2-20111031.tar.gz
echo !nFileSize!
)
pause
:获取指定文件的大小
:getFileSize
@echo off
set strFilePath=%1%
set /a nFileSize=0
for /f "delims=" %%i in ('dir %strFilePath% /s/b') do set /a nFileSize=%%~zi
echo %nFileSize%
goto :EOF