start命令一般用来打开一个文件(通常是可执行程序)或文件夹。
先用start /?命令大致了解帮助信息。
这个dir既可以是磁盘根目录,也可以是磁盘内的子目录。如果不加min或max参数,就会默认最大化打开(在前台打开)。
如果要打开e盘根目录,执行命令【start e:】。
如果要打开e盘根目录下的某文件夹(例如adobe),执行命令【start e:\adobe】
这个path既可以是文档类的txt、doc、excel文件,也可以是多媒体mp3、mp4文件,也可以是可执行exe、bat文件。
尝试一下打开exe文件,【start D:\绿色免安装小软件汇总\PdgCntEditor_PDF目录编辑器\PdgCntEditor.exe】。
顺利地打开了。
啥意思呢?啥叫注意空格问题?
cmd窗口中的不同参数之间往往使用空格进行区分,如果你使用空格往往意味着空格之后是下一个参数或者赋予空格前的参数的取值。
例如酷狗音乐的路径是【D:\Program Files (x86)\KuGou\KGMusic\KuGou.exe】,那么这时我们执行命令【start D:\Program Files (x86)\KuGou\KGMusic\KuGou.exe】,会发现出错了。提示找不到文件(夹)【D:\Program】,容易知道cmd程序将空格前后的路径字符串分割开了,我们如何解决这个问题呢?
解决方法很简单,哪个层级目录的名称中有空格,就在哪里加双引号。执行命令【start D:\"Program Files (x86)"\KuGou\KGMusic\KuGou.exe】。
注意不是执行命令【start "D:\Program Files (x86)\KuGou\KGMusic\KuGou.exe"】 ,直观上反映出来,会重新打开一个cmd窗口,因为cmd程序把【"D:\Program Files (x86)\KuGou\KGMusic\KuGou.exe"】当做"title"字段了,不信你看新建的CMD窗口标题是不是跟title的一样。
如果完整路径上有多个空格,这时候给每一个层级加双引号显然就比较麻烦了。
事实上我们还有另一种方法。
假设要打开文件夹【D:\BaiduNetdiskDownload\test1 2 3\test 3 4 5】,执行命令【start "" "D:\BaiduNetdiskDownload\test1 2 3\test 3 4 5"】(第一个双引号对应title,随意填什么内容,最好填"",不是很重要)。
如果不想执行命令后窗口立即显示在屏幕上,也即想要在后台打开,可以用/min参数。
例如打开某exe程序,执行命令【start /min D:\绿色免安装小软件汇总\PdgCntEditor_PDF目录编辑器\PdgCntEditor.exe】
果然是在后台悄咪咪打开的。
但是我还是发现有一些程序,即使添加/min参数,
也无法在后台打开,比如酷狗音乐。
Call命令的外部调用是指调用已经写好的bat文件,假设被调用bat文件名称是【demo.bat】,主动调用的bat文件名是【main.bat】,那么在main.bat中调用demo.bat就需要用到call命令。
类似C语言中的函数声明,函数定义在demo.bat中进行,函数声明在主程序文件main.bat中进行。
先打印call命令的帮助信息。
下面我们看看具体怎么用call来进行外部调用。
新建一个demo.bat文件,里面的代码为。
- @echo off
- echo 现在开始执行子程序
- echo 你会数到10吗?
- echo 难不倒我! 1,2,3,4,5,6,7,8,9,10
- echo 真厉害呢
- echo 祝你幸福
- echo 见了鬼
- echo 怎么后面的都没执行
- echo 见了鬼
- echo 继续啊?
再新建一个main.bat文件,里面的代码为。
- chcp 65001
- @echo off
- echo 嘿老铁抓好了!主程序开始跑了...
- echo 你会数数吗?
- echo 这个我不会,但是我儿子会,你去问他。
- call D:\D-desktop\demo.bat
- echo 主程序也结束了,好好休息一下吧。
- pause
可见直接用【call path】就能成功调用。
但是在实验过程中我还是发现了一些问题。
第一个问题:假使子程序文件最后一行有pause,就会把靠近pause的几行中句号结尾、或者问号结尾的行当做命令看待,结果就会出错。
例如将demo.bat文件修改,而main.bat文件保持不变。
- @echo off
- echo 现在开始执行子程序
- echo 你会数到10吗?
- echo 难不倒我! 1,2,3,4,5,6,7,8,9,10
- echo 真厉害呢
- echo 祝你幸福。
- echo 见了鬼。
- echo 怎么后面的都没执行。
- echo 见了鬼。
- echo 继续啊?
- pause
执行后pause的前4行都出现了问题。
第二个问题:假使我去掉子程序文件中最后一行的pause,那么也会出现最后几行命令失效的情况。
同样将demo.bat文件予以修改,然后main.bat保持不变。
- @echo off
- echo 现在开始执行子程序
- echo 你会数到10吗?
- echo 难不倒我!1,2,3,4,5,6,7,8,9,10
- echo 真厉害呢
- echo 祝你幸福
- echo 见了鬼
- echo 怎么后面的都没执行
- echo 见了鬼
- echo 继续啊
执行结果如下图所示,最后4行又全军覆没。千万别以为仅仅最后4行才会出问题,你们可以自己去试,一大堆bug,所以建议这个功能谨慎使用,能把代码放在主程序就放进去。
新建一个demo.bat文件,里面放的代码如下
- chcp 65001
- @echo off
- echo 小大人,您玩累了吗?
- call :part1
- echo 我累了,我不想说话,麻烦转给part1先生
- :part1
- echo ......
- echo ......
- echo ......
- echo 过了十分钟后...
- echo 现在按任意键即可继续玩耍啦
- pause
执行该bat文件后,输出结果如下。
也就是说,call那一行会调用:part1那一行下面一行至最后一行,然后不是结束(这是和goto命令最大的不同),而是从call的下一行继续执行。
下面给出goto命令,以此和call的内部调用用法进行比较。
当bat文件内容如下时
- chcp 65001
- @echo off
- echo 小大人,您玩累了吗?
- goto :part1
- echo 我累了,我不想说话,麻烦转给part1先生
- :part1
- echo ......
- echo ......
- echo ......
- echo 过了十分钟后...
- echo 现在按任意键即可继续玩耍啦
- pause
执行结果如下!goto命令下面的一行“我累了...”,后面压根就没执行。
tasklist
start 程序名
taskkill /im notepad.exe
(关闭记事本)taskkill /pid 1234
(关闭 PID 为 1234 的进程)
net start
net start 服务名
net stop 服务名