找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 40984|回复: 11

[文本处理] 直接双击bat文件和拖到cmd窗口运行有什么区别?运行完毕后,回显窗口都会自动关闭?

[复制链接]
发表于 2016-9-12 14:17:10 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-9-12 19:40 编辑

1.直接双击.bat和拖到cmd窗口回车运行有什么区别?
如果撇开运行的路径不说,其它方面有什么不同?

2.是不是所有.bat脚本运行完毕后,回显的cmd窗口都会自动关闭?
比如我写了一个很简单的脚本,想要打开cmd,然后cd到桌面路径应该怎么写?
  1. @echo off
  2. pushd C:\Users\Users\Desktop
复制代码
这样没有用,双击后cmd窗口一闪而过。
然后我再加了pause,这时窗口在,但是press any key之后窗口还是关闭。
发表于 2016-9-12 14:42:37 | 显示全部楼层
本帖最后由 DiamondbacK 于 2016-9-14 10:46 编辑

1. 另一个不同是:双击 .bat 运行结束后会自动退出 cmd;在 cmd 中输入 .bat 路径运行,只要 .bat 中没有执行不带参数的 exit 命令,就不会在运行完成后退出 cmd。
双击 .bat 实际上是执行了
  1. cmd /c ""bat文件路径" "
复制代码
/c 开关的作用就是在执行完命令后自动退出。

2.
  1. @cmd /k pushd "%USERPROFILE%\Desktop"
复制代码
或者不用 bat 脚本,而是给 cmd 创建一个快捷方式,将起始位置设置为 "%USERPROFILE%\Desktop"
或者不创建任何文件,而是在桌面空白处按住 Shift 点击右键,选择「在此处打开命令行窗口」。
 楼主| 发表于 2016-9-12 15:41:35 | 显示全部楼层
本帖最后由 lyonamstrong 于 2016-9-12 15:47 编辑

回复 2# DiamondbacK


    关于1,为什么会有这种区别?是不是有什么特定用途?如何加以利用?
               我个人猜测哦,是不是说打开一个cmd.exe就开启一个进程,只要不关闭这个cmd窗口,那么这个进程就始终在。比如要运行一连串的多个.bat脚本或者有后续操作时,就需要把这些拖进cmd窗口中。而如果是运行单个.bat时就直接双击.bat就可以了?
发表于 2016-9-12 15:58:56 | 显示全部楼层
回复 3# lyonamstrong


    任务完成后自动结束进程,是一个程序应该有的正常行为。
用途就是让你不用手动结束。
 楼主| 发表于 2016-9-12 16:14:45 | 显示全部楼层
回复 4# DiamondbacK


    那我能不能这么理解,如果要看回显,就拖到cmd中执行。如果只要执行不要看回显信息,那么就双击?
发表于 2016-9-13 00:17:26 | 显示全部楼层
1,雙擊用使用的是/C參數 直接執行則是/K
可以參考 cmd /?
/C      執行字串中所描述的命令然後結束命令視窗
/K      執行字串中所描述的命令然後保留命令視窗

2.是這樣沒錯,除非使用/K參數,執行後才會保留視窗
您舉的列子因為跑完了所以直接關閉,這是正常的,當您按了一任鍵表示執所有指令執行完畢關閉視窗也是正常的

例如這個:
  1. @cmd /K @Echo 會關掉嗎?
复制代码
发表于 2016-9-13 02:42:02 | 显示全部楼层
1,批处理属于cmd.exe子进程,方式类似cmd.exe中call "批处理"另一种解释是cmd.exe "批处理"[此类为系统默认关联],就像记事本打开TXT一样
没有什么不同只是注意for内%号多一和少一,批处理是cmd的集合,便于批量处理和编辑比cmd自身高级例如goto等循环调用,但必须借助主进程来完成
2,(1)运行完毕是自动退出[没有特殊执行会退出,因为没有要执行的内容]{特殊情况依旧不会退出例如pause虽然已执行完但是不会退出,需要用户交互控制}
(2)例子:请查阅相关路径用标准写法跳转"path"
发表于 2016-9-13 08:10:40 | 显示全部楼层
采用批处理输入:cmd /k
然后弹出框输入:12
结果出现当前系统时间、当前系统时间太牛逼了,怎么回事?
桌面上也没有叫12的文件或程序啊
发表于 2016-9-13 09:07:58 | 显示全部楼层
回复 8# 诗歌王位


初步判断这应该是个 .bat 或者 .cmd,那么可以这样:
  1. for %%a in (12.bat 12.cmd) do echo;%%~$PATH:a
复制代码
如果系统里有 where.exe,那可以这样:
  1. where 12
复制代码
一个等价的 bat 如下(第 3 个 for 是用来核实大小写):
  1. @echo off

  2. set mypath=%path:"=%
  3. set mypath="%mypath:;=" "%"

  4. set mypathext=%pathext:"=%
  5. set mypathext="%mypathext:;=" "%"

  6. set basename=12

  7. for %%a in (%mypath%) do (
  8.         for %%b in (%mypathext%) do (
  9.                 for %%c in ("%%~fa\%basename%%%~b") do (
  10.                         if exist %%c echo %%~fc
  11.                 )
  12.         )
  13. )

  14. pause
复制代码
也可以用 Tools 库
  1. mshta http://bathome.net/s/hta/?string Tools.where('12') | more
复制代码
发表于 2016-9-13 21:13:27 | 显示全部楼层
回复 6# dreamer


    为什么/c参数在cmd窗口使用后不会关闭cmd窗口,在批处理却可以,比如:
  1. @cmd /c Echo 你好
复制代码
发表于 2016-9-13 21:45:20 | 显示全部楼层
回复 10# idos


在命令行窗口运行 cmd /c,就是创建了一个 cmd.exe 子进程,只不过在父进程窗口中而不是新窗口中。
子进程结束后,就自动返回了父进程,子进程的结束本就不应该关闭父进程的窗口。
发表于 2016-9-13 22:11:01 | 显示全部楼层
回复 11# DiamondbacK


    哇哦,好吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 07:25 , Processed in 0.017997 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表