2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 【批处理DOS-CMD命令-汇总和小结】-应用程序启动和调用 服务和进程操作命令(start call )

【批处理DOS-CMD命令-汇总和小结】-应用程序启动和调用 服务和进程操作命令(start call )

时间:2022-09-20 23:52:01

相关推荐

【批处理DOS-CMD命令-汇总和小结】-应用程序启动和调用 服务和进程操作命令(start call )

一、程序启动命令——start

start命令一般用来打开一个文件(通常是可执行程序)或文件夹,当然也可以是一个网址。

先用【start /?】命令大致了解帮助信息。

1.1 打开某一个文件夹——start dir

这个dir既可以是磁盘根目录,也可以是磁盘内的子目录。如果不加min或max参数,就会默认最大化打开(在前台打开)。

如果要打开e盘根目录,执行命令【start e:】。

如果要打开e盘根目录下的某文件夹(例如adobe),执行命令【start e:\adobe】

1.2 打开某个文件——start path

这个path既可以是文档类的txt、doc、excel文件,也可以是多媒体mp3、mp4文件,也可以是可执行exe、bat文件。

尝试一下打开exe文件,【start D:\绿色免安装小软件汇总\PdgCntEditor_PDF目录编辑器\PdgCntEditor.exe】。

顺利地打开了。

1.3 不管是打开什么,都要注意空格问题

啥意思呢?啥叫注意空格问题?

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,随意填什么内容,最好填"",不是很重要)。

1.4 打开一个网站网址——start page_site

因为start命令还支持打开一个网站,所以我们可借用cmd窗口打造搜索引擎。

把下面的代码放进一个bat文件中,双击执行

@echo offchcp 65001set /p var1=请输入搜索对象:start /s?wd=%var1%pause

键入要搜索的内容,比如说【日出】 ,再回车执行,就会自动打开默认浏览器并打开这个start后的网址了。

正是因为键入的内容是一个变量,而这个变量放在了start后的网址字符串中,所以可以实现在cmd中搜索。

1.5 后台打开——参数/min

如果不想执行命令后窗口立即显示在屏幕上,也即想要在后台打开,可以用/min参数。

例如打开某exe程序,执行命令【start /min D:\绿色免安装小软件汇总\PdgCntEditor_PDF目录编辑器\PdgCntEditor.exe】

果然是在后台悄咪咪打开的。

但是我还是发现有一些程序,即使添加/min参数,

也无法在后台打开,比如酷狗音乐。

二、程序调用命令——call

2.1 外部调用用法——call filepath

2.1.1 不带批处理参数(仅有%0)地调用

Call命令的外部调用是指调用已经写好的bat文件,假设被调用bat文件名称是【demo.bat】,主动调用的bat文件名是【main.bat】,那么在main.bat中调用demo.bat就需要用到call命令。

类似C语言中的函数声明,函数定义在demo.bat中进行,函数声明在主程序文件main.bat中进行。

先打印call命令的帮助信息。

下面我们看看具体怎么用call来进行外部调用。

新建一个demo.bat文件,里面的代码为。

@echo offecho 现在开始执行子程序echo 你会数到10吗?echo 难不倒我! 1,2,3,4,5,6,7,8,9,10echo 真厉害呢echo 祝你幸福echo 见了鬼echo 怎么后面的都没执行echo 见了鬼echo 继续啊?

再新建一个main.bat文件,里面的代码为。

chcp 65001@echo offecho 嘿老铁抓好了!主程序开始跑了...echo 你会数数吗?echo 这个我不会,但是我儿子会,你去问他。call D:\D-desktop\demo.batecho 主程序也结束了,好好休息一下吧。pause

可见直接用【call path】就能成功调用。

但是在实验过程中我还是发现了一些问题。

第一个问题:假使子程序文件最后一行有pause,就会把靠近pause的几行中句号结尾、或者问号结尾的行当做命令看待,结果就会出错。

例如将demo.bat文件修改,而main.bat文件保持不变。

@echo offecho 现在开始执行子程序echo 你会数到10吗?echo 难不倒我! 1,2,3,4,5,6,7,8,9,10echo 真厉害呢echo 祝你幸福。echo 见了鬼。echo 怎么后面的都没执行。echo 见了鬼。echo 继续啊?pause

执行后pause的前4行都出现了问题。

第二个问题:假使我去掉子程序文件中最后一行的pause,也会出现最后几行命令失效的情况。

同样将demo.bat文件予以修改,然后main.bat保持不变。

@echo offecho 现在开始执行子程序echo 你会数到10吗?echo 难不倒我!1,2,3,4,5,6,7,8,9,10echo 真厉害呢echo 祝你幸福echo 见了鬼echo 怎么后面的都没执行echo 见了鬼echo 继续啊

执行结果如下图所示,最后4行又全军覆没。

千万别以为仅仅最后4行才会出问题,你们可以自己去试,一大堆bug,所以建议这个功能谨慎使用,能把代码放在主程序就放进去。

后来,我又在子程序bat中最顶头加了一行【chcp 95001】,结果没有明显的改善。

我对Call命令有点小失望!

------------------------0701更新分割符-------------------------

后来我才发现不是call命令的原因。

echo的输出如果有乱码;第一个原因是编码问题,cmd窗口默认是ANSI编码(GBK编码或GB2312编码),往往需要用命令【chcp 65001】改成utf8编码才能不乱码,第二个原因是误识别成命令,这时候可以将要echo的对象两边加上双引号。

demo.bat改成如下代码

@echo offecho "现在开始执行子程序"echo "你会数到10吗?"echo "难不倒我!1,2,3,4,5,6,7,8,9,10"echo "真厉害呢"echo "祝你幸福"echo "见了鬼"echo "怎么后面的都没执行"echo "见了鬼"echo "继续啊"

然后再双击执行main.bat,就正常了。

2.1.2 带批处理参数地调用

新建一个main.bat文件代码如下

chcp 65001@echo offecho 嘿老铁抓好了!主程序开始跑了...echo %0echo %1echo %2call D:\D-desktop\demo.bat arg1 arg2echo %0echo %1echo %2echo 主程序也结束了,好好休息一下吧。pause

再新建一个demo.bat文件,如下

chcp 65001echo %0echo %~0echo %~f0echo %1echo %2

双击执行main.bat文件,结果如下

接下来让我为大家分析一下结果。

在call执行前,只有%0有意义;在执行子程序时,%0被子程序路径覆盖,%1和%2分别对应执行命令【call D:\D-desktop\demo.bat arg1 arg2】中的arg1和arg2;在子程序执行完后,又回到了全局环境,因此%0的值还是主程序路径,而%1和%2没有取值。

从上面的分析过程,我们其实完全可以将批处理参数的逻辑联想至C语言的全局变量、局部变量。

2.2 内部调用用法——call :label

2.2.1 不带批处理参数地调用(仅包括%0)

新建一个demo.bat文件,里面放的代码如下

chcp 65001@echo offecho 小大人,您玩累了吗?call :part1echo 我累了,我不想说话,麻烦转给part1先生:part1echo ......echo ......echo ......echo 过了十分钟后...echo 现在按任意键即可继续玩耍啦pause

执行该bat文件后,输出结果如下。

也就是说,call那一行会调用:part1那一行下面一行至最后一行,然后不是结束(这是和goto命令最大的不同),而是从call的下一行继续执行。

下面给出goto命令,以此和call的内部调用用法进行比较。

当bat文件内容如下时

chcp 65001@echo offecho 小大人,您玩累了吗?goto :part1echo 我累了,我不想说话,麻烦转给part1先生:part1echo ......echo ......echo ......echo 过了十分钟后...echo 现在按任意键即可继续玩耍啦pause

执行结果如下!goto命令下面的一行“我累了...”,后面压根就没执行。

2.2.2 带批处理参数地调用

新建一个bat文件,代码如下:

chcp 65001@echo offecho 嘿老铁抓好了!主程序开始跑了...echo %0echo %~f0echo %1echo %2call :end arg1 arg2echo %0echo %~f0echo %1echo %2echo 主程序也结束了,好好休息一下吧。pause:endecho %0echo %~f0echo %1echo %2

双击执行该文件,结果如下:

如果采用双击执行bat文件的方式,同理你们也可以发现执行到文件内定义的子程序时,%1、%2才会有意义;另外一个很有意思的点,文件内的子程序中的%0等于对应的标签,但是%~f0等于整个bat文件名。

三、进程/服务操作——tasklist、net

3.1进程管理

显示当前正在运行的进程:tasklist运行程序或命令:start 程序名结束进程,按名称:taskkill /im notepad.exe(关闭记事本)结束进程,按 PID:taskkill /pid 1234(关闭 PID 为 1234 的进程)

3.2 服务管理

显示当前正在运行的服务:net start启动指定服务:net start 服务名停止指定服务:net stop 服务名

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。