windows批处理学习(call与start)---02
参考:https://www.cnblogs.com/Braveliu/p/5078283.html
一、call命令总结
(1)call命令简介
语法: call [ [Drive:] [Path] FileName [BatchParameters]] [:label [arguments]]
参数: [Drive:][Path] FileName 指定要调用的批处理程序的位置和名称。Filename 参数必须是.bat 或 .cmd 扩展名的类型文件。
BatchParameters 指定批处理程序所需的命令行信息(即参数项)。
调用另一个批处理程序,并且不终止父批处理程序(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。
call 命令接受用作跳转目标的标签。如果在脚本或批处理文件外使用call,它将不会在命令行起作用。
(2)call命令应用
test1: 新建两个文本文件,一个命名为call1.bat.
1 echo running in call1
另一个命名为call2,修改文件类型为bat,用Notepad++打开编辑内容为:
1 @echo off
2 echo start
3 call call1.bat
4 echo running in call2
5 echo end
6 pause
注意:call1脚本第一行没有再写@echo off语句。因为call2第一行已经关闭了命令回显状态,当call2调用call1时,此设置同样有效,由此可更深入理解调用。
test2: 调用标签。
1 @echo off
2 call :label
3 echo 1
4 echo 2
5
6 :label
7 echo 3
8 echo 4

另一个命名为call4
1 @echo off
2 call call3.bat
3 pause
双击执行call4文件,执行结果如下所示:

test3:调用带参数的批处理
1 echo %1 %2
2 echo %3
另一个命名为call8,修改文件类型为bat,用Notepad++打开编辑内容为:
1 @echo off
2 call call7.bat hello world !
3 dir c:\
4 pause

(3)call命令与goto命令的区别
call命令的应用示例2中,我们看到了call命令对跳转标签的调用,注意调用时必须在标签名前加冒号,而goto是直接跟标签名。
同上例,我们再看看goto的执行效果:新建两个文本文件,一个命名为call5

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/?-->回车,查看“start”命令的参数和用法说明(注:按任意键可以查看更多后面的内容)示例截图如下:

(2)start命令应用
test1 :基本应用。打开系统计算器以及记事本。
新建一个文本文件,命名为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命令的时候,建议要使用与原批处理中不同的标签名来跳转,否则可能会跳转到原批处理中而不能保证完整的执行被调用批处理中的所有语句。
windows批处理学习(call与start)---02的更多相关文章
- windows批处理学习(字符换操作)---04
转自:https://www.cnblogs.com/DswCnblog/p/5432326.html 1.截取字符串 截取字符串可以说是字符串处理功能中最常用的一个子功能了,能够实现截取字符串中的特 ...
- windows批处理学习(for和字符串)---03
[1]for命令简介 先把for循环与for命令类比一下,这样学习理解快. for 循环语句,一般格式如下: 1 for (表达式1;表达式2;表达式3) 2 { 3 循环体; 4 } 1. 表达式1 ...
- windows批处理学习---01
一. 标记符号: CR(0D) 命令行结束符 Escape(1B) ANSI转义字符引导符 Space() 常用的参数界定符 Tab() ; = 不常用的参数界定符 + COPY命令文件连接符 * ? ...
- Windows批处理命令学习中遇到的坑--持续更新中
再次拾起windows批处理命令,下边将一些遇到的小问题写出来,希望可以帮到大家 1.set命令:set主要的作用是为变量赋值,类似于编程语言中的var i = Value:但是在使用的过程中一定要注 ...
- 今天我自己第一次写了一个Windows批处理bat脚本,一起学习一下吧。
今天我自己第一次写了一个Windows批处理bat脚本,备注一下 事情原由:自己使用Java开发了一个加解密的工具.但是当把工具给别人使用的时候,别人还需要把代码编译打包, 然后还需要看一下代码里面的 ...
- windows批处理(cmd/bat)编程详解
reference: http://blog.csdn.net/bingjie1217/article/details/12947327 http://www.cnblogs.com/doit8791 ...
- windows批处理(.bat)
转自http://www.cnblogs.com/shiney/archive/2011/07/04/2097236.html 本文在运行中有一些小小的问题,我修改了一下,将会在稳重标出 批处理文件是 ...
- Windows 批处理大全(附各种实例)
Windows 批处理大全(附各种实例) 2009年07月19日 21:31:00 阅读数:2552 批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命 ...
- 【工作笔记】BAT批处理学习笔记与示例
BAT批处理学习笔记 一.批注里定义:批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD,这些命令统称批处理命令. 二.常见的批处理指令: 命令清单: 1.RE ...
随机推荐
- python中如何退出多层循环
1.定义标记变量:利用变量值的变化退出循环 # 第一种嵌套形式 a = [[1, 2, 3], [5, 5, 6], [7, 8, 9]] # init_i = 0 # init_j = 0 flag ...
- 带提示范围的猜数小游戏--python
import random random_number = random.randint(1, 99) print(random_number) start_data = 1 end_data = 9 ...
- Python学习手册之数据封装、类方法、静态方法和属性函数
在上一篇文章中,我们介绍了 Python 的内部方法.操作符重载和对象生命周期,现在我们介绍 Python 的数据封装.类方法.静态方法和属性函数.查看上一篇文章请点击:https://www.cnb ...
- Go中处理文本格式
首先是xml 解析xml package main import ( "encoding/xml" //xml标准库 "fmt" "io/ioutil ...
- 第三节 循环链表的Go语言实现
一.什么是循环链表 循环链表的节点形成一个圈.把单链表的尾巴指向开头形成单循环链表.把双向链表的尾巴与开头链接起来就形成双向循环链表.使用循环链表可以不断的绕圈寻找所需要的数据,而不需要像单链表那样每 ...
- 利用主成分分析(PCA)简化数据
一.PCA基础 线性映射(或线性变换),简单的来说就是将高维空间数据投影到低维空间上,那么在数据分析上,我们是将数据的主成分(包含信息量大的维度)保留下来,忽略掉对数据描述不重要的成分.即将主成分维度 ...
- WPF 为 PasswordBox 控件添加水印,最低级版
原因也很直接,老板需要,一开始为TextBox发愁,就找了这个控件凑合用,至于版权什么的,内部工具也不卖钱,而且我不懂英文,也就无视了: Extended WPF Toolkit™ Community ...
- 青岛Uber司机奖励政策(8月31号~9月6号)
本周的奖励规则如下,请各位司机朋友按照自己的情况查询. 人民优步(People’s Uber) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全国版 ...
- HTML5 离线应用程序
离线Web应用:当客户端本地与Web应用程序的服务器没有建立连接时,也能正常在客户端本地使用该Web应用. Web应用程序的本地缓存与浏览器的网页缓存的区别 1. 本地缓存为整个Web应用程序服务,网 ...
- 【selenium】selenium全分享
第一节:selenium基础 [http://note.youdao.com/noteshare?id=43603fb53593bfc15c28bc358a3fa6ec] 目录: selenium简介 ...