标题: [已结]如何让BAT模拟函数返回值效率高点?
[打印本页]
作者: hugreen
时间: 2009-4-4 23:04
标题: [已结]如何让BAT模拟函数返回值效率高点?
为了在call调用后返回结果给变量,采用了写文件的方式模拟高级语言函数返回值,但执行效率很低,请问有没有好点的实现方法?
代码如下:
@echo off&setlocal enabledelayedexpansion
color a
for /l %%i in (539,1,600) do (
for /l %%j in (1,1,12) do (
call :read XXXX.TXT %%i %%j 临时
set /p 变量=<%tmp%\临时.tmp
echo !变量!
)
)
pause > nul & exit /b
::读取指定行、列的内容
:read
@echo off&setlocal enabledelayedexpansion
set line=%2
set /a line-=1
for /f "skip=%line% tokens=%3" %%a in (%~1) do (
echo %%a > %tmp%\%4.tmp
goto :eof
)
[
Last edited by hugreen on 2009-4-6 at 20:37 ]
作者: s11ss
时间: 2009-4-5 02:50
直接存入变量
作者: czl1378
时间: 2009-4-5 04:38
二楼说的,直接存入变量。
稍微改下就好了.比如:
@echo off&setlocal enabledelayedexpansion
color a
for /l %%i in (539,1,600) do (
for /l %%j in (1,1,12) do (
call :read XXXX.TXT %%i %%j ret
echo !ret!
)
)
pause > nul & exit /b
::读取指定行、列的内容
:read
@echo off&setlocal enabledelayedexpansion
set line=%2
set /a line-=1
for /f "skip=%line% tokens=%3" %%a in (%~1) do (
set %4=%%a
goto :eof
)
返回的值附给指定的变量:ret,变量名字可以改.
作者: hugreen
时间: 2009-4-5 12:20
谢谢s11ss czl1378,成功获取函数返回值啦!!!!!
按3楼的做法测试不成功,还要考虑个细节:
函数部分应该去掉setlocal enabledelayedexpansion
变量延迟在这里作怪,有点晕,搞不明白原因,反正得这样,如果函数实现里需要开启变量延迟,那就........
作者: czl1378
时间: 2009-4-5 12:23
就在开头加setlocal enabledelayedexpansion不行么?
@echo off
setlocal enabledelayedexpansion
color a
for /l %%i in (539,1,600) do (
for /l %%j in (1,1,12) do (
call :read XXXX.TXT %%i %%j ret
echo !ret!
)
)
pause > nul & exit /b
::读取指定行、列的内容
:read
set line=%2
set /a line-=1
for /f "skip=%line% tokens=%3" %%a in (%~1) do (
set %4=%%a
goto :eof
)
作者: czl1378
时间: 2009-4-5 12:36
只要加入了setlocal enabledelayedexpansion就表示整个批处理到结束都开启了变量延迟吧
作者: 26933062
时间: 2009-4-5 13:21
Quote: |
Originally posted by czl1378 at 2009-4-5 12:36:
只要加入了setlocal enabledelayedexpansion就表示整个批处理到结束都开启了变量延迟吧 |
|
不对。
当遇到 endlocal 时就结束了本地变量,当然也同时关闭了 延迟变量。
作者: czl1378
时间: 2009-4-5 13:37
哦1。endlocal 没用过,学习了。
作者: knoppix7
时间: 2009-4-6 00:35
setlocal的还原问题...
比较通用的方法.
BAT最后那里加上.
Endlocal & Set 要传出的变量=%BAT内部变量%
有必要的话加引号防止符号问题.
作者: czl1378
时间: 2009-4-6 03:00
Quote: |
Originally posted by knoppix7 at 2009-4-6 00:35:
setlocal的还原问题...
比较通用的方法.
BAT最后那里加上.
Endlocal & Set 要传出的变量=%BAT内部变量%
有必要的话加引号防止符号问题. |
|
knoppix7兄,请问最后加上“Endlocal & Set 要传出的变量=%BAT内部变量%”有必要么,难道批处理执行完毕后变量值还存在(是这个意思么)?如果不加会有什么影响呢。?加了又会有什么变化?请举个例子。谢谢。
等待答复中。
作者: hugreen
时间: 2009-4-6 05:15
详见HAT版主的经典帖子:
http://www.cn-dos.net/forum/viewthread.php?tid=45204
下载函数库来看看就清楚了,相见恨晚啊^_^
作者: hugreen
时间: 2009-4-6 05:43
规范后程序修改如下:
@echo off&setlocal enabledelayedexpansion
color a
for /l %%i in (539,1,600) do (
for /l %%j in (1,1,12) do (
call :read XXXX.TXT %%i %%j ret
echo !ret!
)
)
pause > nul & exit /b
:::::::::::::::::::::::::::::::::::::::::::::::::::::
:read %文件% %行% %列% 返回值
::
:: 功能: 获取指定行、列的内容
::
:: 参数: %1 待读取的文件(传值调用)
:: %2 待读取的行(传值调用)
:: %3 待读取的列(传值调用)
:: %4 读取到的内容 (引用调用)
:::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal
set line=%2
set /a line-=1
for /f "skip=%line% tokens=%3" %%a in (%~1) do (
endlocal & set %4=%%a
goto :eof
)
::::::::::::::::::::::::::::::::::::::::::::::::::::::
作者: czl1378
时间: 2009-4-6 07:00
嗯嗯。不错。