标题: [数值计算] 【已解决】批处理使用call调用子标签后如何返回值? [打印本页]
作者: 踏沙行 时间: 2018-8-29 11:53 标题: 【已解决】批处理使用call调用子标签后如何返回值?
本帖最后由 踏沙行 于 2018-8-30 05:16 编辑
原贴搜索不到,只好发新帖求助。不过虽与原贴处理的文档相同,但问题不同。
已知:I:\2.txt有如下内容- 1##4072.0###52.19### #72## #
- 2#38705.8# # # 51.73## #70# #
- 372###389.0##51.80##19.77# # 72#####
- 4##59.71#3715.45##71######
复制代码
问题:将最后一们数字乘以7,然后输出新的结果
我的代码如下:- @echo off
- Setlocal enabledelayedexpansion
- for /f "tokens=*" %%a in (H:\2.txt) do (
- call :lp "%%a" string
- echo,%string% )
- pause&exit
-
- :lp
- set "s=%~1"
- set/a "i=0" &set "flag="
- :loop
- set/a "i-=1"
- if "!s:~%i%,1!" geq "0" if "!s:~%i%,1!" leq "9" set/a "flag=i"
- if not defined flag goto loop
- set "begin=!s:~,%flag%!"
- set/a "var=!s:~%i%,1!*7","n=flag+1"
- set "end=!s:~%n%!")
- echo,old=%s%
- set "new=%begin%%var%%end%"
- set %2=%new%
- 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内容如下:复制代码
要求,用call和子标签,来取出每行开头到倒数第一位字符中间的内容- @echo off
- for /f %%a in (H:\1.txt) do (
- call :lp %%a b
- echo,b=%b% )
- pause&exit
-
- :lp
- set "Str=%1"
- set "T=%str:~,-1%"
- set "%2=%T%"
- goto:eof
复制代码
【问题】得不到返回值,即set %2=%T%这一句,并没有把结果回传回去。
作者: Batcher 时间: 2018-8-29 22:02
回复 6# 踏沙行
不知道你怎么试的,我这边测试3楼的方法没问题。- @echo off
- setlocal enabledelayedexpansion
- for /f %%a in (1.txt) do (
- call :lp %%a b
- echo b=!b!
- )
- pause
- goto:eof
-
- :lp
- set "str=%1"
- set "T=%str:~,-1%"
- set "b=%T%"
复制代码
作者: xczxczxcz 时间: 2018-8-29 22:05
回复 1# 踏沙行
第 5 行 改成复制代码
ok
作者: 踏沙行 时间: 2018-8-29 22:16
谢谢二位,我也是刚刚找到问题,因为主程序使用for,所以在echo的时候,应该使用!!,我之前使用的是%%
变量延迟,真是一个大问题。
作者: yhcfsr 时间: 2018-8-30 14:40
本帖最后由 yhcfsr 于 2018-8-30 14:54 编辑
回复 9# 踏沙行
- 19行new改为string,20行删掉.
- 你这个不用SETLOCAL保护的根本不需要变量返回,只需要在子程序中对变量string赋值就行了.
- 不过理论上,第20行将string的值重复赋值给string应该也没什么问题啊?
- 你测试时最好用echo来跟踪变量,或许能找到原因.
给你写个参考例子.- @echo off
-
- call :test1 "bat home" val1
- echo;%val1%
- call :test2 "123 4567" val2
- echo;%val2%
- pause&exit
-
- :test1
- set "str1=%~1"
- set "str1=%str1:~,-1%"
- set "val1=%str1%"
- goto:eof
-
- :test2
- setlocal
- set "str2=%~1"
- set "str2=%str2:~,-1%"
- endlocal&set "%2=%str2%"&goto:eof
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |