Board logo

标题: [数值计算] 【已解决】批处理使用call调用子标签后如何返回值? [打印本页]

作者: 踏沙行    时间: 2018-8-29 11:53     标题: 【已解决】批处理使用call调用子标签后如何返回值?

本帖最后由 踏沙行 于 2018-8-30 05:16 编辑

原贴搜索不到,只好发新帖求助。不过虽与原贴处理的文档相同,但问题不同。
已知:I:\2.txt有如下内容
  1. 1##4072.0###52.19### #72## #
  2. 2#38705.8# # # 51.73## #70# #
  3. 372###389.0##51.80##19.77# # 72#####
  4. 4##59.71#3715.45##71######
复制代码
问题:将最后一们数字乘以7,然后输出新的结果
我的代码如下:
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. for /f "tokens=*" %%a in (H:\2.txt) do (
  4. call :lp "%%a" string
  5. echo,%string% )
  6. pause&exit
  7. :lp
  8. set "s=%~1"
  9. set/a "i=0" &set "flag="
  10. :loop
  11. set/a "i-=1"
  12. if "!s:~%i%,1!" geq "0" if "!s:~%i%,1!" leq "9" set/a "flag=i"
  13. if not defined flag goto loop
  14. set "begin=!s:~,%flag%!"  
  15. set/a "var=!s:~%i%,1!*7","n=flag+1"
  16. set "end=!s:~%n%!")
  17. echo,old=%s%
  18. set "new=%begin%%var%%end%"
  19. set %2=%new%
  20. goto:eof
复制代码
问题:在子标签中倒是可以实现既定效果。但是:
1、如果把结果返回,返回值为空,不知道到底该怎么返回?现在的代码中哪里有错误,怎么修改?
2、Setlocal enabledelayedexpansion声明好像在主程序中没有作用,怎么把它限定在子标签区域?做这种调整有什么意义?
作者: Batcher    时间: 2018-8-29 13:17

第一行,需要72*7还是2*7呢?
作者: yhcfsr    时间: 2018-8-29 13:36

既然子程序没用setlocal做变量保护,你把子程序中的new改成string就行
作者: 踏沙行    时间: 2018-8-29 18:47

本帖最后由 踏沙行 于 2018-8-29 19:51 编辑

回复 1# 踏沙行
最后一个数字乘以7,是2*7
现在最大的问题在这一句:
set %2=%new%
想返回结果,但是无法得到返回结果。不知道问题出在哪里了?
作者: Batcher    时间: 2018-8-29 21:28

回复 4# 踏沙行


    3楼的方法试过了吗?
作者: 踏沙行    时间: 2018-8-29 21:38

回复 5# Batcher
已经试过,无效。

现在简化一下,以例题来尝试
已知:H:\1.txt内容如下:
  1. abcde
  2. feghj
  3. klmno
  4. pqrst
复制代码
要求,用call和子标签,来取出每行开头到倒数第一位字符中间的内容
  1. @echo off
  2. for  /f %%a in (H:\1.txt) do (
  3. call :lp %%a b
  4. echo,b=%b% )
  5. pause&exit
  6. :lp
  7. set "Str=%1"
  8. set "T=%str:~,-1%"
  9. set "%2=%T%"
  10. goto:eof
复制代码
【问题】得不到返回值,即set %2=%T%这一句,并没有把结果回传回去。
作者: Batcher    时间: 2018-8-29 22:02

回复 6# 踏沙行


不知道你怎么试的,我这边测试3楼的方法没问题。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f %%a in (1.txt) do (
  4.     call :lp %%a b
  5.     echo b=!b!
  6. )
  7. pause
  8. goto:eof
  9. :lp
  10. set "str=%1"
  11. set "T=%str:~,-1%"
  12. set "b=%T%"
复制代码

作者: xczxczxcz    时间: 2018-8-29 22:05

回复 1# 踏沙行

第 5 行 改成
  1. echo;!string!
复制代码
ok
作者: 踏沙行    时间: 2018-8-29 22:16

谢谢二位,我也是刚刚找到问题,因为主程序使用for,所以在echo的时候,应该使用!!,我之前使用的是%%
变量延迟,真是一个大问题。
作者: yhcfsr    时间: 2018-8-30 14:40

本帖最后由 yhcfsr 于 2018-8-30 14:54 编辑

回复 9# 踏沙行



给你写个参考例子.
  1. @echo off
  2. call :test1 "bat home" val1
  3. echo;%val1%
  4. call :test2 "123 4567" val2
  5. echo;%val2%
  6. pause&exit
  7. :test1
  8. set "str1=%~1"
  9. set "str1=%str1:~,-1%"
  10. set "val1=%str1%"
  11. goto:eof
  12. :test2
  13. setlocal
  14. set "str2=%~1"
  15. set "str2=%str2:~,-1%"
  16. endlocal&set "%2=%str2%"&goto:eof
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2