![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-11 15:49 |
共 47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [已结]如何让BAT模拟函数返回值效率高点? |
| 可打印版本 994 / 12 |
| 第1楼 hugreen | 发表于 2009-04-04 23:04 |
| 初级用户 发帖 15 积分 23 | |
|
[已结]如何让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 ] |
|
| 第2楼 s11ss | 发表于 2009-04-05 02:50 |
| 银牌会员 发帖 566 积分 2,098 | |
|
直接存入变量
|
|
| 第3楼 czl1378 | 发表于 2009-04-05 04:38 |
| 初级用户 发帖 114 积分 161 | |
|
二楼说的,直接存入变量。
稍微改下就好了.比如: 返回的值附给指定的变量:ret,变量名字可以改. |
|
| 第4楼 hugreen | 发表于 2009-04-05 12:20 |
| 初级用户 发帖 15 积分 23 | |
|
谢谢s11ss czl1378,成功获取函数返回值啦!!!!!
按3楼的做法测试不成功,还要考虑个细节: 函数部分应该去掉setlocal enabledelayedexpansion 变量延迟在这里作怪,有点晕,搞不明白原因,反正得这样,如果函数实现里需要开启变量延迟,那就........ |
|
| 第5楼 czl1378 | 发表于 2009-04-05 12:23 |
| 初级用户 发帖 114 积分 161 | |
|
就在开头加setlocal enabledelayedexpansion不行么?
|
|
| 第6楼 czl1378 | 发表于 2009-04-05 12:36 |
| 初级用户 发帖 114 积分 161 | |
|
只要加入了setlocal enabledelayedexpansion就表示整个批处理到结束都开启了变量延迟吧
|
|
| 第7楼 26933062 | 发表于 2009-04-05 13:21 |
| 银牌会员 发帖 879 积分 2,268 | |
Originally posted by czl1378 at 2009-4-5 12:36: 不对。 当遇到 endlocal 时就结束了本地变量,当然也同时关闭了 延迟变量。 |
|
| 第8楼 czl1378 | 发表于 2009-04-05 13:37 |
| 初级用户 发帖 114 积分 161 | |
|
哦1。endlocal 没用过,学习了。
|
|
| 第9楼 knoppix7 | 发表于 2009-04-06 00:35 |
| 银牌会员 发帖 634 积分 1,287 来自 cmd.exe | |
|
setlocal的还原问题...
比较通用的方法. BAT最后那里加上. Endlocal & Set 要传出的变量=%BAT内部变量% 有必要的话加引号防止符号问题. |
|
| 第10楼 czl1378 | 发表于 2009-04-06 03:00 |
| 初级用户 发帖 114 积分 161 | |
Originally posted by knoppix7 at 2009-4-6 00:35: knoppix7兄,请问最后加上“Endlocal & Set 要传出的变量=%BAT内部变量%”有必要么,难道批处理执行完毕后变量值还存在(是这个意思么)?如果不加会有什么影响呢。?加了又会有什么变化?请举个例子。谢谢。 等待答复中。 |
|
| 第11楼 hugreen | 发表于 2009-04-06 05:15 |
| 初级用户 发帖 15 积分 23 | |
|
详见HAT版主的经典帖子:http://www.cn-dos.net/forum/viewthread.php?tid=45204
下载函数库来看看就清楚了,相见恨晚啊^_^ |
|
| 第12楼 hugreen | 发表于 2009-04-06 05:43 |
| 初级用户 发帖 15 积分 23 | |
|
规范后程序修改如下:
@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 ) :::::::::::::::::::::::::::::::::::::::::::::::::::::: |
|
| 第13楼 czl1378 | 发表于 2009-04-06 07:00 |
| 初级用户 发帖 114 积分 161 | |
|
嗯嗯。不错。
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |