当前位置: 代码迷 >> 其他开发语言 >> bat函数的返回值解决方案
  详细解决方案

bat函数的返回值解决方案

热度:263   发布时间:2016-05-02 04:03:34.0
bat函数的返回值

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
  相关解决方案