批处理命令——call 和 start

一、call命令总结

【1】call命令简介

  学过汇编或C的朋友,肯定都知道call指令表示什么意思。其实,在这里它的意思也是一样的。在批处理脚本中,call命令用来从一个批处理脚本中调用另一个批处理脚本。

  语法: call [ [Drive:] [Path] FileName [BatchParameters]] [:label [arguments]]

  参数: [Drive:][Path] FileName  指定要调用的批处理程序的位置和名称。Filename 参数必须是.bat 或 .cmd 扩展名的类型文件。

  BatchParameters 指定批处理程序所需的命令行信息(即参数项)。

  调用另一个批处理程序,并且不终止父批处理程序(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。

  call 命令接受用作跳转目标的标签。如果在脚本或批处理文件外使用call,它将不会在命令行起作用。

【2】call命令应用

  1. 基本应用。应用示例:新建两个文本文件,一个命名为call1,修改文件的类型为bat,用Notepad++打开编辑内容为:

1 echo running call1

  另一个命名为call2,修改文件类型为bat,用Notepad++打开编辑内容为:

1 @echo off
2 echo start
3 call call1.bat
4 echo running call2
5 echo end
6 pause

  双击执行call2文件,执行结果如下所示:

  过程解析:

  可以很清晰的看到,call调用类似于函数调用的执行逻辑:call2相当于执行主函数,在其执行过程中,需要调用到call1函数,当call1执行结束后,call2主函数再继续执行本身的命令,直至整个过程结束。

  注意:call1脚本第一行没有再写@echo off语句。因为call2第一行已经关闭了命令回显状态,当call2调用call1时,此设置同样有效,由此可更深入理解调用。

  2. 调用标签。应用示例:新建两个文本文件,一个命名为call3,修改文件的类型为bat,用Notepad++打开编辑内容为:

1 @echo off
2 call :label
3 echo 1
4 echo 2
5
6 :label
7 echo 3
8 echo 4

  另一个命名为call4,修改文件类型为bat,用Notepad++打开编辑内容为:

1 @echo off
2 call call3.bat
3 pause

  双击执行call4文件,执行结果如下所示:

  过程解析:

  看到这个结果什么感觉?让你想起了什么呢?想不起来啥?一看你若有所茫的样子,就知道你把goto与这个搞混了!请看下文call命令与goto命令的区别。

  3. 调用带参数的批处理。应用示例:新建两个文本文件,一个命名为call7,修改文件的类型为bat,用Notepad++打开编辑内容为:

1 echo %1 %2
2 echo %3

  另一个命名为call8,修改文件类型为bat,用Notepad++打开编辑内容为:

1 @echo off
2 call call7.bat hello world 123
3 dir c:4 pause

  双击执行call8文件,执行结果如下所示:

【3】call命令与goto命令的区别

  call命令的应用示例2中,我们看到了call命令对跳转标签的调用,注意调用时必须在标签名前加冒号,而goto是直接跟标签名。

  关于goto命令不懂的可以参见同系列随笔《批处理命令——goto 和 :》

  同上例,我们再看看goto的执行效果:新建两个文本文件,一个命名为call5,修改文件的类型为bat,用Notepad++打开编辑内容为:

1 @echo off
2 goto label
3 echo 1
4 echo 2
5
6 :label
7 echo 3
8 echo 4

  另一个命名为call6,修改文件类型为bat,用Notepad++打开编辑内容为:

1 @echo off
2 call call5.bat
3 pause

  双击执行call6文件,执行结果如下所示:

二、start命令总结

【1】start命令简介

  start命令比较复杂。查看其帮助文档的步骤如下:

  1. 同时按下“Win + R”键(或者桌面开始-->开始-->运行),打开“运行”窗口,输入“cmd”-->确定。

  2. 在打开的命令提示符窗口里,输入start/?-->回车,查看“start”命令的参数和用法说明(注:按任意键可以查看更多后面的内容)示例截图如下:

  3. 命令提示符窗口里,按自己的使用需要,输入-->start /具体参数-->回车,即可按自己的需要、在Windows系统里使用“start”命令

【2】start命令应用

  1.基本应用。打开系统计算器以及记事本。

  新建一个文本文件,命名为start1,修改文件类型为bat,用Notepad++打开编辑内容为:

1 start calc
2 start notepad
3 exit

  执行结果:分别打开计算器和记事本,同时终端一闪而过(因为最后exit)。

【3】start命令与call命令的区别

  start命令应用示例:新建两个文本文件,一个命名为startmain,修改文件类型为bat,用Notepad++打开编辑内容为:

1 @echo off
2 set a=1
3 pause>nul
4 echo start startchild.bat
5 start startchild.bat
6 echo end start
7 pause>nul
8 echo %b%
9 pause>nul

  一个命名为startchild,修改文件类型为bat,用Notepad++打开编辑内容为:

1  @echo off
2 echo %a%
3 set b=20
4 pause>nul

  双击执行startmain.bat,观察其运行结果如下图所示:

  相同的应用,如果改为call命令:新建两个文本文件,一个命名为callmain,修改文件类型为bat,用Notepad++打开编辑内容为:

1 @echo off
2 set a=1
3 pause>nul
4 echo call callchild.bat
5 call callchild.bat
6 echo end call
7 pause>nul
8 echo %b%
9 pause>nul

  一个命名为callchild,修改文件类型为bat,用Notepad++打开编辑内容为:

1  @echo off
2 echo %a%
3 set b=20
4 pause>nul

  双击执行callmain.bat,观察其运行结果如下图所示:

  分析结果:

  应用示例中,在main.bat中定义了变量a,值为1;在child.bat中定义了变量b,值为20。

  main.bat首先执行call child.bat,然后child.bat将执行echo %a%,现在能正常显示1。

  call完之后,main.bat将执行echo %b%,也能正常显示20。

  那么,如果将call改为start,待child.bat执行完再关闭之后,main.bat继续echo %b%,将无法显示变量b的值,而仅相当于执行echo命令,执行结果为:ECHO处于关闭状态。

  call的时候,他们拥有同一个壳cmd.exe,在同一个进程当中,所以他们的变量是互通的。

  start的时候,他们拥有两个壳cmd.exe,但child.bat可以看成是main.bat的子进程,子进程可以读取父进程中的变量(即a的值)。

  总结结论:

  对于start,概况二句话:“不同进程不能传值”,“相同进程单向传值,老子传儿子,非儿子传老子”。

  对于call,“同一进程,变量互通”。

  另外,可以从以下几方面理解start与call命令的区别:

  一是调用范围不同:call主要用来进行批处理的内部调用,如call :pend 和一些dos命令的调用如call set test=2,但也可以调用其他可执行文件,而start则不能进行内部调用,但其可以执行基本上所有的外部程序,还可以执行shell,如打开文件夹start "" "%WINDIR%",安装网络打印机start "" "\\IP\Printer"等等。

  二是调用方式不同:call是严格意义上而言的调用,在call另一个批处理时是在同一窗体进程里执行,而start则是执行,所以在执行另外一个批处理时是在不同的窗体进程里进行,也就是说在新开启的进程里执行,虽然start可以加入b参数,但其结果却完全不同。如我们使用call set test=2 和 start /b set test=2 看似执行的结果相同,但是我们发现后者有两个进程,而且在窗体里要执行两次exit才能退出,所以当我们使用start来执行一个批处理后最好在被调用的批处理中也加一个exit,否则无法退出被调用的批处理的dos窗体,但是使用call调用时如果在被调用的批处理中存在exit则会直接结束原始和被调用的批处理程序,这是一个非常严重的问题。建议在被调用的批处理中使用goto :eof来取代exit。

  三是调用结果不同:call调用不仅可以把参数或变量传给被调用的批处理,而且被调用的批处理也可以设置参数或变量以便回传,而start只能把参数或变量传给被调用的批处理,却不能回传参数或变量,这一点实际上是第二点的延伸。另外,我们还必须注意一点:使用call调用其他批处理时,在被调用的批处理中若我们使用goto命令的时候,建议要使用与原批处理中不同的标签名来跳转,否则可能会跳转到原批处理中而不能保证完整的执行被调用批处理中的所有语句。

http://www.cnblogs.com/Braveliu/p/5078283.html

时间: 2024-10-13 07:24:14

批处理命令——call 和 start的相关文章

BATCH(BAT批处理命令语法)

bat语法备忘扩展名是bat(在nt/2000/xp/2003下也可以是cmd)的文件就是批处理文件[@[email protected]] bat语法备忘扩展名是bat(在nt/2000/xp/2003下也可以是cmd)的文件就是批处理文件. ==== 注 ======================================= .bat是dos下的批处理文件 .cmd是nt内核命令行环境的另一种批处理文件 从 更广义的角度来看,unix的shell脚本以及其它操作系统甚至应用程序中由外

cocos2d-x教程3:用php或DOS批处理命令来转换文件和解压缩zip

tinyurl.com/nrxcsea tinyurl.com/nanqhzt tinyurl.com/l2wh6kg tinyurl.com/o3ekj2w tinyurl.com/q3865ld tinyurl.com/ny2gcsw tinyurl.com/o8cabvz tinyurl.com/or7pq8t tinyurl.com/lokv5dw tinyurl.com/pecmpqm tinyurl.com/kafpj4l tinyurl.com/orlulbc tinyurl.co

Win批处理命令基本操作

介绍批处理命令也有原因的,是由于在使用jenkins处理集成的时候,有些dll需要编译后拷贝到Web层的,否则反射是无法执行的.好了,切入正题 批处理文件是无格式的文本文件.包括一条或多条.扩展名为.bat或cmd.在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们. 下面简单介绍基本的语法使用 1echo命令 打开或关闭请求回显功能,显示当前设置 echo [{on|off}][message] Sample:@ech

批处理命令 BAT备份MySQL数据库

原文:批处理命令 BAT备份MySQL数据库 工作环境 Windows Server 2003 ,MySQL安装目录 D:\MySQL , WinRAR 安装目录 C:\Program Files\WinRAR\WinRAR.exe 备份数据存储的路径为 E:\数据备份,好了下面开始写DOS批处理命令了.代码如下: set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%" md "E:\数据备份\%ymd%" "D:\MySQL

批处理命令启动和关闭tomcat

批处理命令启动和关闭tomcat,其实只要把tomcat自己的脚本呼叫起来就好了呢 关闭tomcat if exist "C:\Tomcat-7.0.39\bin\shutdown.bat" call "C:\Tomcat-7.0.39\bin\shutdown.bat" 启动tomcat if exist "C:\Tomcat-7.0.39\bin\startup.bat" call "C:\Tomcat-7.0.39\bin\sta

windows下利用批处理命令生成maven项目(java、javaWeb)

觉得用IDE生成maven项目会卡住,很慢.就用cmd写了个cmd批处理命令来生成maven项目.效果如下 生成项目导入idea后结构如下 批处理命令代码如下 @echo off ::echo 请选择项目类型: echo 1.maven-archetype-quickstart echo 2.maven-archetype-webapp set /p webType=请选择项目类型: ::echo 选择了%webType% set /p DgroupId= DgroupId= set /p Da

windows批处理命令教程

批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们 批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们.使用批 处理文件(也被称为批处理程序或脚本),可以简化日

C# 动态执行批处理命令

本文转载:http://www.cnblogs.com/lenic/p/4097045.html C# 动态执行一系列控制台命令,并允许实时显示出来执行结果时,可以使用下面的函数.可以达到的效果为: 持续的输入:控制台可以持续使用输入流写入后续的命令 大数据量的输出:不会因为大数据量的输出导致程序阻塞 友好的 API:直接输入需要执行的命令字符串即可 函数原型为: /// <summary> /// 打开控制台执行拼接完成的批处理命令字符串 /// </summary> /// &

批处理命令:带参数的字符串替换

批处理命令:带参数的字符串替换 @echo off setlocal enabledelayedexpansion set main_str=hello world set src=hello set dst=hi echo %main_str% set sub_str=!main_str:%src%=%dst%! echo %sub_str%