中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-11 15:01
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何让BAT模拟函数返回值效率高点? 查看 993 回复 12
楼 主 [已结]如何让BAT模拟函数返回值效率高点? 发表于 2009-04-04 23:04 ·  中国 广东 广州 电信
初级用户
积分 23
发帖 15
注册 2008-03-26 19:44
18年会员
UID 114120
性别 男
状态 离线
为了在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 发表于 2009-04-05 02:50 ·  中国 北京 海淀区 联通
银牌会员
★★★
积分 2,098
发帖 566
注册 2007-09-11 07:27
18年会员
UID 97070
性别 男
状态 离线
直接存入变量
3 发表于 2009-04-05 04:38 ·  中国 湖北 荆州 洪湖市 电信
初级用户
★★
积分 161
发帖 114
注册 2009-02-20 13:00
17年会员
UID 139375
性别 男
状态 离线
二楼说的,直接存入变量。

稍微改下就好了.比如:


@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,变量名字可以改.
4 发表于 2009-04-05 12:20 ·  中国 广东 河源 联通
初级用户
积分 23
发帖 15
注册 2008-03-26 19:44
18年会员
UID 114120
性别 男
状态 离线
谢谢s11ss czl1378,成功获取函数返回值啦!!!!!
按3楼的做法测试不成功,还要考虑个细节:
函数部分应该去掉setlocal enabledelayedexpansion
变量延迟在这里作怪,有点晕,搞不明白原因,反正得这样,如果函数实现里需要开启变量延迟,那就........
5 发表于 2009-04-05 12:23 ·  中国 湖北 荆州 洪湖市 电信
初级用户
★★
积分 161
发帖 114
注册 2009-02-20 13:00
17年会员
UID 139375
性别 男
状态 离线
就在开头加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
)
6 发表于 2009-04-05 12:36 ·  中国 湖北 荆州 洪湖市 电信
初级用户
★★
积分 161
发帖 114
注册 2009-02-20 13:00
17年会员
UID 139375
性别 男
状态 离线
只要加入了setlocal enabledelayedexpansion就表示整个批处理到结束都开启了变量延迟吧
7 发表于 2009-04-05 13:21 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
Originally posted by czl1378 at 2009-4-5 12:36:
只要加入了setlocal enabledelayedexpansion就表示整个批处理到结束都开启了变量延迟吧

不对。
当遇到 endlocal 时就结束了本地变量,当然也同时关闭了 延迟变量。
致精致简!
8 发表于 2009-04-05 13:37 ·  中国 湖北 荆州 洪湖市 电信
初级用户
★★
积分 161
发帖 114
注册 2009-02-20 13:00
17年会员
UID 139375
性别 男
状态 离线
哦1。endlocal 没用过,学习了。
9 发表于 2009-04-06 00:35 ·  中国 北京 联通
银牌会员
★★★
积分 1,287
发帖 634
注册 2007-05-02 15:06
19年会员
UID 87277
性别 男
来自 cmd.exe
状态 离线
setlocal的还原问题...

比较通用的方法.

BAT最后那里加上.
Endlocal & Set 要传出的变量=%BAT内部变量%
有必要的话加引号防止符号问题.
10 发表于 2009-04-06 03:00 ·  中国 湖北 荆州 电信
初级用户
★★
积分 161
发帖 114
注册 2009-02-20 13:00
17年会员
UID 139375
性别 男
状态 离线
Originally posted by knoppix7 at 2009-4-6 00:35:
setlocal的还原问题...

比较通用的方法.

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


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

等待答复中。
11 发表于 2009-04-06 05:15 ·  中国 广东 河源 联通
初级用户
积分 23
发帖 15
注册 2008-03-26 19:44
18年会员
UID 114120
性别 男
状态 离线
详见HAT版主的经典帖子:http://www.cn-dos.net/forum/viewthread.php?tid=45204
下载函数库来看看就清楚了,相见恨晚啊^_^
12 发表于 2009-04-06 05:43 ·  中国 广东 河源 联通
初级用户
积分 23
发帖 15
注册 2008-03-26 19:44
18年会员
UID 114120
性别 男
状态 离线
规范后程序修改如下:

@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 发表于 2009-04-06 07:00 ·  中国 湖北 荆州 电信
初级用户
★★
积分 161
发帖 114
注册 2009-02-20 13:00
17年会员
UID 139375
性别 男
状态 离线
嗯嗯。不错。
论坛跳转: