【问题标题】:Create a new cmd.exe window from within another cmd.exe prompt从另一个 cmd.exe 提示符中创建一个新的 cmd.exe 窗口
【发布时间】:2022-01-20 00:52:03
【问题描述】:

我正在设置 CruiseControl.NET。我遇到的问题是我将 CC 作为控制台应用程序运行,当我的构建成功完成并执行(使用 exec)时,它会在 CruiseControl DOS 提示符下启动它。我只是使用简单的批处理文件来启动我的应用程序,但让它在与 CC 相同的提示符下运行导致 CC 认为只要我的应用程序运行,构建就会继续。

cmd.exe 的命令行参数是否会生成另一个单独的提示窗口?

【问题讨论】:

  • cmd.exe 是 CUI shell,而不是 GUI。它不会创建窗口。它使用由控制台主机进程 conhost.exe 的实例创建和管理的控制台窗口。如果 CUI 程序正常启动,则基本客户端 DLL(kernel32.dll 或 kernelbase.dll)中的初始化代码会继承父控制台(如果有)或分配新控制台,除非它以创建标志 DETACHED_PROCESS 启动(即没有控制台)。如果它以创建标志 CREATE_NEW_CONSOLE 开始(正如 CMD 的 start 使用的那样),则基本 DLL 总是分配一个新的控制台,而不是继承父级的。

标签: windows command-line cmd


【解决方案1】:

我认为这可行:

start cmd.exe

【讨论】:

  • 确保你检查了所有不同的启动选项“开始/?” /wait 和 /I 可以派上用场。
  • fwiw,您甚至不必在启动后放置“cmd.exe”。只要“开始”这个词就可以了。
  • start /d 对于那些想要为新的 cmd 窗口设置路径的人。 Here详细说明。
【解决方案2】:

这是您需要的代码:

start cmd.exe @cmd /k "Command"

【讨论】:

  • @cmd 在做什么?有相关文档吗?
  • @ 抑制直接输出,通常会显示在提示符中,但命令仍会执行。
  • 我用过这个,它可以工作,但是如果尝试通过键盘中断ctrl+c杀死正在运行的程序,运行程序不会停止。它只会在您关闭新打开的命令提示符窗口时停止。
  • 不适用于使用^ 的多行命令。 :( 有什么办法解决这个问题?
【解决方案3】:

只需在命令提示符中输入start

start

这将打开新的cmd 窗口。

【讨论】:

    【解决方案4】:
    start cmd.exe 
    

    打开一个单独的窗口

    start file.cmd 
    

    打开批处理文件并在另一个命令提示符中执行它

    【讨论】:

      【解决方案5】:

      您可以在命令提示符下键入以下 3 个命令:

      1. start

      2. start cmd

      3. start cmd.exe

      【讨论】:

        【解决方案6】:
        START "notepad.exe"
        echo Will launch the notepad.exe application
        PAUSE
        

        要制作任何 cmd 文件类型,只需将内容保存为 .bat,即

        @echo
        TITLE example.bat
        PAUSE
        taskkill/IM cmd.exe
        

        将其制作成“example.bat”文件,保存,然后打开并运行。

        【讨论】:

          【解决方案7】:

          简单的写入你的bat文件

          @cmd
          

          @cmd /k "command1&command2"
          

          【讨论】:

          • 感谢& 在新提示中执行多个命令。我喜欢添加exit,以便在命令运行完成后关闭提示。
          【解决方案8】:

          如果我们简单地使用start 命令或start cmd.exe 它会打开cmd。

          如果要打开同一个命令提示符窗口;

          start "Command Prompt"
          

          【讨论】:

            【解决方案9】:

            我还尝试在 CCNET 任务结束时执行运行守护进程/服务器的批处理文件; 使 CruiseControl 生成一个独立的异步进程而不等待进程结束的唯一方法是:

            1. 创建一个批处理文件来运行守护进程(服务器应用程序)
            2. 使用任务调度程序将批处理文件作为 CCNET 任务运行(使用 schtasks.exe)

              schtasks.exe /create /F /SC once /ST 08:50 /TN TaskName /TR "c:/path/to/batchFileName.bat"
              
              • 08:50 是 HH:MM 时间格式

            你可能需要在启动 ccnet 时终止进程

            PS:使用“start cmd.exe”选择的答案不起作用;确实生成了一个新的命令提示符,但 CCNET 将等待生成的 cmd 完成。

            【讨论】:

              猜你喜欢
              • 2019-03-18
              • 1970-01-01
              • 2013-12-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多