中国DOS联盟论坛

中国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:
只要加入了setlocal enabledelayedexpansion就表示整个批处理到结束都开启了变量延迟吧

不对。
当遇到 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:
setlocal的还原问题...

比较通用的方法.

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


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