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

仿批处理命令call参数列表 调用 多参数的变量型函数

最近和zm讨论中说到这个问题,之前的代码丢了,现在从自己盘里找了这个div子过程(例子比较典型)改造之:
  1. @echo off
  2. call:div 31 2003 1000 ans
  3. echo 31/2003 的前1000位小数为:
  4. echo %ans%
  5. pause&goto:eof
  6. :div <dividend> <divisor> <pre> <ret> //code by plp
  7. Setlocal Enabledelayedexpansion&set/a b=%2,R=%1%%b*10&set "dc="
  8. For /l %%z In (1 1 %3)Do set/a d=R/b,R=R%%b*10&set dc=!dc!!d!
  9. endlocal&set %4=%dc%
复制代码
这是典型的call调用,div子过程共4个参数,
第一个参数为被除数,第二个为除数,第三个为小数的位数(精度),第四个为返回的变量名
调用后子过程没有改变父环境变量值,因为有setlocal 和endlocal 。。。

讨论的问题是,如果用变量型函数像call这样“调用”多参数,代码如何写?
  1. @echo off
  2. :: 定义_div 变量型函数
  3. rem 代码。。。。。?
  4. %_div% 31 2003 1000 ans
  5. echo 31/2003 的前1000位小数为:
  6. echo %ans%
复制代码
  1. @echo off
  2. :: 定义_div 变量型函数 ;返回两个整数商的小数部分
  3. :: <dividend> <divisor> <pre> <ret> //code by plp
  4. Set "_div=setlocal enabledelayedexpansion&set n=&set argv=&for %%a in (1 2)do if defined argv ((for %%b in (^!argv^!)do set/a n+=1&set #^!n^!=%%b)&set/a b=^!#2^!,R=^!#1^!%%b*10&set dc=&(For /l %%z In (1 1 ^!#3^!)Do set/a d=R/b,R=R%%b*10&set dc=^!dc^!^!d^!)&for /f "tokens=1-2" %%A in (^"^^!#4^^! ^^!dc^^!^^")do endlocal&set %%A=%%B)else set argv="
  5. %_div% 31 2003 1000 ans
  6. echo 31/2003 的前1000位小数为:
  7. echo %ans%
  8. if "%~0"=="%~f0" set/p=
  9. goto:eof
  10. ___END___
  11. 思路大致是
  12. setlocal&set argv=
  13. for %%a in (1 2)do if defined argv (
  14.    for 获取argv的变量值用#“数组”存放,#1为第一个参数入口,#2为第二个参数入口。。。
  15.   你的变量型函数在这里展开。。。。
  16.   endlocal&退出并复制结果给返回变量名
  17. ) else set argv=
复制代码


对于变量型函数多参数的调用,有简单直接的思路(但要写代码者自己维护变量空间)
大家可参看此贴一楼的测试代码
http://www.bathome.net/viewthread.php?tid=11799

新手对变量型函数不太了解的,可参看变量型函数发源贴:
http://www.bathome.net/thread-5861-1-1.html
1

评分人数

    • CrLf: 原来可以这样,很巧妙!PB + 10 技术 + 2

本帖最后由 plp626 于 2011-12-21 10:05 编辑

回复 7# netbenton

我这是拾人牙慧;
话说很少见netben兄发帖哈,
---------
忽然觉得此帖合并到兄的那个发源贴后有利于坛友讨论,和阅读。
申请合并。

TOP

返回列表