[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
10# plp626
怎么觉得楼上的用法如此怪异
原来是@()的在作怪

在call 不支持直接调用标签的时候
那时是MS-DOS为王的时代
就已经有了标准调用内部或外部的标签的做法
基本上采用下面的形式

1.简单的基本用法
@echo off
if [%1]==[$] goto %2

:sub1
rem some code
goto :end

:end

调用的时候采用
call %0 $ sub1
外部调用采用
call lib.bat $ sub1

2.在需要传递参数的时候
@echo off
if [%1]==[] goto :end
shift
shift
goto %0

:function1
echo %1+%2+%3
rem some code
goto :end

:end

调用的时候采用
call %0 $ func1 arg1 arg2 arg3
外部调用采用
call lib.bat $ func1 arg1 arg2 arg3

3.在需要返回结果值的时候
@echo off
if [%1]==[] goto :end
shift
shift
goto %0

:func2
rem some code
set _ret=%2-%1-%3
goto :end

:end

调用的时候仍然采用
call %0 $ func2 arg1 arg2 arg3
外部调用也是采用
call lib.bat $ func2 arg1 arg2 arg3
只不过多了使用 %_ret% 引用返回结果的语句罢了

4.到了WinNT时代
cmd功能强了限制少了
Call可以直接调用内部标签了
shift移位可以保留%0了
命令行参数也可以增强扩展了
标签名不再限制8个字符长度了
不过基本思想变化不大

@echo off
if [%1]==[$] shift/1&shift/1&goto %2

:function
rem some code
set _ret=%2-%1-%3
goto :end

:end

调用的时候仍然采用
call %0 $ func2 arg1 arg2 arg3
外部调用也是采用
call lib.bat $ func2 arg1 arg2 arg3

5.当然对于要求不严格的场合
用if not [%1]==[] goto %1跳转标签也是可以的
天的白色影子

TOP

12# plp626
call存在对"^"的错误处理
而且使用 call :label 会丢失掉%0
而在 :label 中可能会使用到这个 %0
比如遇到错误时的抛出处理
或者对自身文本内容的操作
所以在此之前需要 set program_name=%0

至于%1 %2 %3
即使goto到:label
也仍然可以使用%*分析命令行
而call:%2 %*会把/plp也传进去
这未必是你想看到的吧?

“如果shift要goto费时”
没看懂

下面是采用:标志子过程调用的处理方法
调用采用 call lib.cmd :sub1 arg1 arg2
  1. @echo off
  2. for /f "tokens=2 delims=:" %%s in ("_%1") do shift/1&goto %%s
  3. :sub1
  4. echo %0-%1-%2-%3.
  5. echo %*.
  6. pause
  7. goto :eof
复制代码
下面是采用.标志子过程调用的处理方法
调用采用 call lib.cmd sub1. arg1 arg2
  1. @echo off
  2. if [%~sn1.]==[%~s1] shift/1&goto :%~sn1
  3. :sub1
  4. echo %0-%1-%2-%3.
  5. echo %*.
  6. pause
  7. goto :eof
复制代码
天的白色影子

TOP

返回列表