|  | 
 
| hugreen 初级用户
 
   
 
 
 
 积分 23
 发帖 15
 注册 2008-3-26
 状态 离线
 | 
| 『楼 主』:
 [已结]如何让BAT模拟函数返回值效率高点?
 
使用 LLM 解释/回答一下 
 
 
为了在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 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
二楼说的,直接存入变量。 
稍微改下就好了.比如:
 @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 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
谢谢s11ss   czl1378,成功获取函数返回值啦!!!!!按3楼的做法测试不成功,还要考虑个细节:
 函数部分应该去掉setlocal enabledelayedexpansion
 变量延迟在这里作怪,有点晕,搞不明白原因,反正得这样,如果函数实现里需要开启变量延迟,那就........
 
 
 
 
 |  | 
|  2009-4-5 12:20 |  | 
|  | 
 
| czl1378 初级用户
 
   
 
 
 
 积分 161
 发帖 114
 注册 2009-2-20
 状态 离线
 | 
| 『第 5 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
就在开头加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 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
只要加入了setlocal enabledelayedexpansion就表示整个批处理到结束都开启了变量延迟吧 
 
 
 
 |  | 
|  2009-4-5 12:36 |  | 
|  | 
 
| 26933062 银牌会员
 
      
 
 
 
 积分 2268
 发帖 879
 注册 2006-12-19
 状态 离线
 | 
| 『第 7 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
Originally posted by czl1378 at 2009-4-5 12:36:只要加入了setlocal enabledelayedexpansion就表示整个批处理到结束都开启了变量延迟吧
 
不对。 
当遇到 endlocal 时就结束了本地变量,当然也同时关闭了 延迟变量。 
 
 
 
 
 |  
                  |  致精致简!
 |  | 
|  2009-4-5 13:21 |  | 
|  | 
 
| czl1378 初级用户
 
   
 
 
 
 积分 161
 发帖 114
 注册 2009-2-20
 状态 离线
 |  | 
|  2009-4-5 13:37 |  | 
|  | 
 
| knoppix7 银牌会员
 
      
 
 
 
 积分 1287
 发帖 634
 注册 2007-5-2
 来自 cmd.exe
 状态 离线
 | 
| 『第 9 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
setlocal的还原问题...
 比较通用的方法.
 
 BAT最后那里加上.
 Endlocal & Set 要传出的变量=%BAT内部变量%
 有必要的话加引号防止符号问题.
 
 
 
 
 |  | 
|  2009-4-6 00:35 |  | 
|  | 
 
| czl1378 初级用户
 
   
 
 
 
 积分 161
 发帖 114
 注册 2009-2-20
 状态 离线
 | 
| 『第 10 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
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 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
规范后程序修改如下:
 @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 |  |