@echo off&setlocal
for %%a in (hello;world;good;feel;thankyou) do call :ansi %%a 这句是用CALL语句调用:ANSI标签,并将%%a的值做为第一个参数传递给指定的标签
echo Finish!!!
goto:eof
:ansi
echo %1
goto:eof  注意:这里使用goto:eof 语句是为了返回FOR语句继续执行,如果echo %1这句语句是文件的最后一条一句那么goto:eof可有可无,如果后面还有其他语句,那必须要用goto:eof语句返回才可以。

 

 

关于同一批处理使用多个同样的命令,把这个用了多次的批处理改为一个子程序,用 call调用。
具体写法是
goto :eof
:一个标记
批处理内容
goto :eof
调用子程序的方法是
call :一个标记
另外要注意,子程序要放到脚本的最后,如果有多个子程序用:标记来划分就可以了。
如果是同一个功能的命令的话,可以放到一个子程序里,如果是不同功能的命令的话要放两个子程序
例1:
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
此例子视为同一个功能的命令,那么就写
goto :eof
:结束程序(这是注释哈,自己随便定义的,这就是那个标记)
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
goto :eof
这就是一段同一个功能的命令并连续执行的子程序。。。
在使用的时候直接用 call :结束程序 来调用此段子程序。
那么另一段功能不同,而且也是一个同一批处理使用多次的命令要组成子程序就要用goto :eof分隔开,
并用:标记,来区分。
例2:
下面这段代码我用了多次
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
这段代码也用了多次
md c:\1.txt
md c:\2.txt
md c:\3.txt
但是并不是结束完程序,就开始建立文件,中间还有其他语句,那么把他们改为子程序来调用如何写呢?看下面
goto :eof
:结束程序
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
goto :eof(不同功能的子程序要用goto :eof来分隔一下,用:标记来区分。)
:建立文件
md c:\1.txt
md c:\2.txt
md c:\3.txt
goto :eof
调用子程序的时候用 call :标记 来使用,
比如
call :结束程序
call :建立文件
为什么两个都是常用的命令,却要用goto :eof 来分隔开呢。。
当然是有原因的了。。因为这两段程序“结束程序”和“建立文件”两个子程序,是在同一个批处理里用了好多次。
但是他们并不是同时使用的,也就是说,并不是结束完程序,就建立文件,而是结束完程序,还有其他内容。然后
又用到建立文件,所以要用goto :eof来分隔一下。
普通的跳转goto 执行跳转是直接 goto 标记
但是子程序调用是 goto :标记 标记前面多了个冒号。。所以要注意。。。
表达的不是很明白,有点晕哈~~
写个完整的例子看看吧。
对照例1的
ping 192.168.0.1
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
ping 192.168.0.2
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
ping 192.168.0.3
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
exit
批处理的意思就是
ping完192.168.0.1 后,关闭程序1.exe 2.exe 3.exe 、
ping完192.168.0.2 后,关闭程序1.exe 2.exe 3.exe 、
ping完192.168.0.3 后,关闭程序1.exe 2.exe 3.exe 、
退出
那么“关闭程序1.exe 2.exe 3.exe”这段代码在同一程序里用了3次,写这么长,多麻烦。。那么我们给他加进
子程序里去....
ping 192.168.0.1
call :结束程序
ping 192.168.0.2
call :结束程序
ping 192.168.0.3
call :结束程序
exit
goto :eof
:结束程序
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
goto :eof
使用子程序,和不使用子程序的代码,看起来有没有规范些,清爽些呢?
这只是简单的脚本,如果是一个很麻烦的命令,一个脚本里用了N次,如果每次都写同样的代码,,会很烦的,所以
还是建议大家在同一个批处理使用过多次的命令或语句,就搞成子程序来调用好了。
刚才例2就有点麻烦了。。。写下看看。
ping 192.168.0.1
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
ping 192.168.0.2
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
ping 192.168.0.3
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
ping 192.168.0.4
md c:\1.txt
md c:\2.txt
md c:\3.txt
ping 192.168.0.5
md c:\1.txt
md c:\2.txt
md c:\3.txt
ping 192.168.0.6
md c:\1.txt
md c:\2.txt
md c:\3.txt
exie
批处理的意思就是
ping完192.168.0.1 后,关闭程序1.exe 2.exe 3.exe 、
ping完192.168.0.2 后,关闭程序1.exe 2.exe 3.exe 、
ping完192.168.0.3 后,关闭程序1.exe 2.exe 3.exe 、
ping完192.168.0.4 后,建立名为1 2 3的三个文本 、
ping完192.168.0.5 后,建立名为1 2 3的三个文本 、
ping完192.168.0.6 后,建立名为1 2 3的三个文本 、
退出
这个就看出麻烦来了吧。。。
那好,,把用了N次的命令写进子程序里
ping 192.168.0.1
call :结束程序
ping 192.168.0.2
call :结束程序
ping 192.168.0.3
call :结束程序
ping 192.168.0.4
call :建立文件
ping 192.168.0.5
call :建立文件
ping 192.168.0.6
call :建立文件
exit
goto :eof
:结束程序
taskkill /f /im 1.exe
taskkill /f /im 2.exe
taskkill /f /im 3.exe
goto :eof
:建立文件
md c:\1.txt
md c:\2.txt
md c:\3.txt
goto :eof

 

 

   可能大家在看教程或者代码时,总是难免会碰到 goto :eof 这样一句代码,大家都知道,goto 就是跳转到的意思,goto 后面跟着的是标签,也就是用 : 定义的标签,但,一般见到的 goto 后面的标签都是没有 : 这个的,怎么这里却使用了呢?

而找遍所有代码都没发现有 :eof 或者 eof 的踪影,怎么这里能正常使用而不出错呢?

其实,:eof 是内置标签,所以,我们就可以不用定义而去使用它了
那么它又有什么用呢?

据我所知,它有两个作用,在不同的位置,有不同的作用

1、在主程序中使用 goto :eof

主程序,就是指 批文件 的主要部分,(大家都知道,批文件有主程序和子程序之分)如果是在主程序的最后使用 goto :eof ,那它的作用就是 退出批处理并关闭cmd窗口,这个没什么难理解的,作用相当于 exit(也不一定要在主程序最后,在主程序的任何位置使用 goto :eof 都是结束批文件并关闭cmd窗口)

2、在子程序中使用 goto :eof

上面说到了,批处理有主程序和子程序,子程序就是指,用 call 调用的部分,如

@echo off
echo 欢迎来到
call :deepin
pause
goto :eof
:deepin
echo 深度软件分坛批处理技术讨论区
goto :eof

上面这个例子,主程序是指

@echo off
echo 欢迎来到
call :deepin
pause
goto :eof

最后使用了 goto :eof ,因为是在主程序的最后使用,所以,它的作用就是退出批处理并关闭cmd窗口

下面的

:deepin
echo 深度软件分坛批处理技术讨论区
goto :eof

就可以说是这个批文件的子程序了,由主程序中的 call 调用,最下面,也用到了 goto :eof ,那么它的作用又是什么,是否跟上面的一样呢?

肯定不一样啦,如果一样,还要说吗?呵呵……

它的作用就是:结束当前子程序并把控制权交还给调用它的主程序以便主程序继续执行下面的命令(我晕,这句乍就这么拗口)

啥意思呢?

看上面例子,结束子程序,就是结束 由 deepin 定义的子程序,如上面的 echo 深度软件分坛批处理技术讨论区
把控制权交还给调用它的主程序,就是哪个调用它就把它还给哪个,好让它继续执行下面的代码

如果上面例子,就是返回到 call :deepin 这一句,然后继续执行下面的 pause以及接下来的代码

其实,说白了,就是执行完了这个子程序后就回到调用它的主程序然后继续执行它下面的代码

明白了没呢

主程序、子程序,都是相对而言的,没有一个明确的界定

如:

@echo off
echo 欢迎来到
call :deepin
pause
goto :eof
:deepin
echo 深度软件分坛
call :bat
goto :eof
:bat
echo 批处理技术讨论区
goto :eof

:deepin
echo 深度软件分坛
call :bat
goto :eof


@echo off
echo 欢迎来到
call :deepin
pause
goto :eof

的子程序,而

:bat
echo 批处理技术讨论区
goto :eof

又是

:deepin
echo 深度软件分坛
call :bat
goto :eof

的子程序

所以说,主或子都是不一定的,主程序,同时也可以是其它主程序的子程序,而子程序又可以是其它子程序的主程序,所以,主程序跟子程序都是相对的概念,并没有明确的界定标准

在用 call 调用子程序时,在子程序的最后一定要加上 goto :eof 让它返回到 call 那里,不然,批处理会继续执行下去,也就达不到实际的效果了

注:如果子程序的下面没有代码了,那加不加都是一样的