|
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
状态 离线
|
|
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
状态 离线
|
|
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
状态 离线
|
|
2009-4-6 07:00 |
|