中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何让BAT模拟函数返回值效率高点?
作者:
标题: [已结]如何让BAT模拟函数返回值效率高点? 上一主题 | 下一主题
hugreen
初级用户





积分 23
发帖 15
注册 2008-3-26
状态 离线
『楼 主』:  [已结]如何让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 ]

2009-4-4 23:04
查看资料  发短消息 网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 2 楼』:  

直接存入变量

2009-4-5 02:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
czl1378
初级用户





积分 161
发帖 114
注册 2009-2-20
状态 离线
『第 3 楼』:  

二楼说的,直接存入变量。

稍微改下就好了.比如:
@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,变量名字可以改.

2009-4-5 04:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hugreen
初级用户





积分 23
发帖 15
注册 2008-3-26
状态 离线
『第 4 楼』:  

谢谢s11ss   czl1378,成功获取函数返回值啦!!!!!
按3楼的做法测试不成功,还要考虑个细节:
函数部分应该去掉setlocal enabledelayedexpansion
变量延迟在这里作怪,有点晕,搞不明白原因,反正得这样,如果函数实现里需要开启变量延迟,那就........

2009-4-5 12:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
czl1378
初级用户





积分 161
发帖 114
注册 2009-2-20
状态 离线
『第 5 楼』:  

就在开头加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
)


2009-4-5 12:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
czl1378
初级用户





积分 161
发帖 114
注册 2009-2-20
状态 离线
『第 6 楼』:  

只要加入了setlocal enabledelayedexpansion就表示整个批处理到结束都开启了变量延迟吧

2009-4-5 12:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by czl1378 at 2009-4-5 12:36:
只要加入了setlocal enabledelayedexpansion就表示整个批处理到结束都开启了变量延迟吧

不对。
当遇到 endlocal 时就结束了本地变量,当然也同时关闭了 延迟变量。



致精致简!
2009-4-5 13:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
czl1378
初级用户





积分 161
发帖 114
注册 2009-2-20
状态 离线
『第 8 楼』:  

哦1。endlocal 没用过,学习了。

2009-4-5 13:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 9 楼』:  

setlocal的还原问题...

比较通用的方法.

BAT最后那里加上.
Endlocal & Set 要传出的变量=%BAT内部变量%
有必要的话加引号防止符号问题.

2009-4-6 00:35
查看资料  发短消息 网志   编辑帖子  回复  引用回复
czl1378
初级用户





积分 161
发帖 114
注册 2009-2-20
状态 离线
『第 10 楼』:  



  Quote:
Originally posted by knoppix7 at 2009-4-6 00:35:
setlocal的还原问题...

比较通用的方法.

BAT最后那里加上.
Endlocal & Set 要传出的变量=%BAT内部变量%
有必要的话加引号防止符号问题.

knoppix7兄,请问最后加上“Endlocal & Set 要传出的变量=%BAT内部变量%”有必要么,难道批处理执行完毕后变量值还存在(是这个意思么)?如果不加会有什么影响呢。?加了又会有什么变化?请举个例子。谢谢。

等待答复中。

2009-4-6 03:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hugreen
初级用户





积分 23
发帖 15
注册 2008-3-26
状态 离线
『第 11 楼』:  

详见HAT版主的经典帖子:http://www.cn-dos.net/forum/viewthread.php?tid=45204
下载函数库来看看就清楚了,相见恨晚啊^_^

2009-4-6 05:15
查看资料  发短消息 网志   编辑帖子  回复  引用回复
hugreen
初级用户





积分 23
发帖 15
注册 2008-3-26
状态 离线
『第 12 楼』:  

规范后程序修改如下:

@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
)
::::::::::::::::::::::::::::::::::::::::::::::::::::::

2009-4-6 05:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
czl1378
初级用户





积分 161
发帖 114
注册 2009-2-20
状态 离线
『第 13 楼』:  

嗯嗯。不错。

2009-4-6 07:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: