【问题标题】:cmd.exe doesn't terminate when using a .bat file使用 .bat 文件时 cmd.exe 不会终止
【发布时间】:2013-02-20 12:42:42
【问题描述】:

[上下文:我正在尝试创建一个 .bat 文件的快捷方式,其具有相对“开始”路径,大致描述为 herehere。]

cmd.exe 支持/c 开关。根据文档,这应该会导致它“执行命令然后终止”。

但是当命令是.bat 文件时,该开关似乎被忽略了。 例如,如果您使用以下目标创建快捷方式(对于普通的非 bat 命令):

C:\Windows\System32\cmd.exe /c "START /d C:\temp\ notepad.exe test.txt"

一切正常:记事本打开,控制台(shell)消失。但是,如果您将上面的命令替换为 .bat 文件,如下所示:

C:\Windows\System32\cmd.exe /c "START /d C:\temp\ C:\test.bat"

(其中test.bat 仅包含“notepad.exe test.txt”)记事本像以前一样打开,但控制台像一个不受欢迎的朋友一样粘在身边。为什么?更重要的是,我该如何让它消失?

更新:我知道我可以使用 wscript,就像在 this solution 中一样,但是我失去了使用自定义图标的选项(我被默认的 .vbs 图标卡住了)。

【问题讨论】:

    标签: shell windows-7 cmd switch-statement desktop-shortcut


    【解决方案1】:

    start 命令为批处理文件启动一个新进程。原来的cmd.exe 然后终止,但留下了新进程,因为它正在等待notepad.exe 终止。

    将您的 bat 文件内容更改为:

    start "" notepad.exe test.txt
    

    那么你的批处理文件不会等到记事本退出再继续执行。

    要尝试的另一件事:

    C:\Windows\System32\cmd.exe /c "START /d C:\temp\ C:\test.bat & exit"
    

    核心选项是用您选择的(编译)语言编写一个小程序,该程序启动 .bat 文件然后退出。然后你可以给它一个自定义图标,让它做任何你喜欢的事情。

    【讨论】:

    • 嗯,我得到的行为与您建议的不同(当我从命令行启动记事本时,它会立即返回。)但尽管如此,我帖子中的批处理文件只是一个示例。实际生产中的批处理文件并没有真正在我的控制之下,所以很遗憾我无法更改它。
    • 啊,我知道您手动运行它是对的。不过,如果您手动运行批处理文件,您会看到记事本阻止批处理文件继续运行。
    • 关于手动运行批处理文件的好处。你说得对。另外,感谢您编辑的建议,但我已经尝试过,结果相同。
    • 核心选项是用您选择的(编译)语言编写一个小程序,该程序启动 .bat 文件然后退出。然后你可以给它一个自定义图标,让它做任何你喜欢的事情。
    【解决方案2】:

    您还可以看看 http://autoitscript.com 的 Autoit 作为批处理的替代方案。 - Run() 命令可以以更好的可预测性来做这种事情。由于它可以生成可执行文件,因此您可以直接从快捷方式链接它。当然,您还可以做更多的事情,比如以不同的用户身份运行、插入延迟或处理错误,这些都很难用批处理来完成。

    您不需要完整的工具包,只需下载中的 Aut2EXE 文件夹即可。

    顺便说一句,在没有 UPX 压缩的情况下构建您的 exe,因为这会导致 AV 误报。

    【讨论】:

    • 这需要广泛分发,第三方解决方案不是一个选项。
    【解决方案3】:

    我有点晚了,但这是答案。

    documentationstart 声明:

    Syntax
    START "title" [/D path] [options] "command" [parameters]  
    
        If command is an internal cmd command or a batch file then the command  
        processor is run with the /K switch to cmd.exe. This means that the  
        window will remain after the command has been run.
    

    如果使用start 执行批处理文件,打开的cmd 实例不会关闭。

    您也可以改用call
    call C:\test.bat

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 2011-12-16
      • 1970-01-01
      • 2014-04-18
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多