[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 【已解决】批处理使用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声明好像在主程序中没有作用,怎么把它限定在子标签区域?做这种调整有什么意义?
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

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

回复 9# 踏沙行



  • 19行new改为string,20行删掉.
  • 你这个不用SETLOCAL保护的根本不需要变量返回,只需要在子程序中对变量string赋值就行了.
  • 不过理论上,第20行将string的值重复赋值给string应该也没什么问题啊?
  • 你测试时最好用echo来跟踪变量,或许能找到原因.

给你写个参考例子.
  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
复制代码
QQ 33892006

TOP

谢谢二位,我也是刚刚找到问题,因为主程序使用for,所以在echo的时候,应该使用!!,我之前使用的是%%
变量延迟,真是一个大问题。

TOP

回复 1# 踏沙行

第 5 行 改成
  1. echo;!string!
复制代码
ok

TOP

回复 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%"
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 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%这一句,并没有把结果回传回去。

TOP

回复 4# 踏沙行


    3楼的方法试过了吗?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

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

TOP

既然子程序没用setlocal做变量保护,你把子程序中的new改成string就行
QQ 33892006

TOP

第一行,需要72*7还是2*7呢?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表