【问题标题】:Running Windows batch file commands asynchronously异步运行 Windows 批处理文件命令
【发布时间】:2010-11-29 18:27:47
【问题描述】:

说,如果我有

  • foo.exe
  • bar.exe
  • baz.exe

如何从批处理文件中异步运行所有这些,即不等待前一个程序停止?

【问题讨论】:

    标签: batch-file cmd


    【解决方案1】:

    使用START 命令运行每个程序应该可以满足您的需要:

    START "title" [/D path] [options] "command" [parameters]
    

    每个START 调用都会运行其参数中给出的命令并立即返回,除非使用/WAIT 开关执行。

    这适用于命令行应用程序。无论如何,没有命令行的应用程序会立即返回,所以可以肯定的是,如果你想异步运行,请使用START

    【讨论】:

    • 好的,谢谢。我应该仔细阅读help 的每个条目。 :)
    • 无耻的自我宣传:我曾经创建了一个批处理,它可以用作某种线程池,仅用于进程:stackoverflow.com/questions/672719/…
    • 如果您需要提供参数或者命令的路径包含空格,请记得添加引号。在这种情况下,您还需要为打开的控制台窗口提供标题: start "" "[path to command]" [command args]
    • “没有命令行的应用程序会立即返回” – 你确定吗? Why GUI application blocks a batch file?
    【解决方案2】:

    使用以下行创建一个批处理文件:

    start foo.exe
    start bar.exe
    start baz.exe 
    

    start command 在新窗口中运行您的命令,因此所有 3 个命令都将异步运行。

    【讨论】:

    • 只要你没有带空格的路径就可以工作。然后当你在它周围加上双引号时,它会考虑标题,而不是应用程序。这行得通。 START "VMPlayer" /D "C:\Users\gavin\Virtual Machines\CentOS 8 64-bit" "C:\Program Files (x86)\VMware\VMware Player\vmplayer.exe"
    【解决方案3】:

    您可以使用 start 命令在不启动新窗口的情况下生成后台进程:

    start /b foo.exe

    新进程不会被 CTRL-C 中断;您只能使用 CTRL-BREAK(或通过关闭窗口,或通过任务管理器)杀死它。

    【讨论】:

    【解决方案4】:

    结合之前的几个答案,您可以尝试start /b cmd /c foo.exe

    举个简单的例子,如果你想打印出 java/groovy/grails/gradle 的版本,你可以在一个批处理文件中这样做:

    @start /b cmd /c java -version
    @start /b cmd /c gradle -version
    @start /b cmd /c groovy -version
    @start /b cmd /c grails -version
    

    如果你有类似 Process Explorer (Sysinternals) 的东西,你会看到几个 cmd.exe 子进程,每个子进程都有一个 java 进程(根据上述命令)。输出将以它们完成的任何顺序打印到屏幕上。

    start /b :  Start application without creating a new window. The
                 application has ^C handling ignored. Unless the application
                 enables ^C processing, ^Break is the only way to interrupt
                 the application
    
    cmd /c : Carries out the command specified by string and then terminates
    

    【讨论】:

    • 它防止命​​令被回显到控制台。在批处理脚本中,有时您会在开头看到echo off,当您执行脚本时,它将阻止所有命令回显到控制台。 @ 类似,但仅针对该单个命令。所以,有时你会看到@echo off
    • 对我不起作用。仍然停止等待应用程序关闭,然后再继续。
    【解决方案5】:

    还有第三种(可能更容易)选项。如果你想启动单个程序的多个实例,使用像 Xargs 或 GNU Parallel 这样的 Unix 风格的命令处理器可以使这个过程变得相当简单。

    有一个名为 PPX2 的 win32 Xargs 克隆让这变得相当简单。

    例如,如果您想对视频文件目录进行转码,您可以运行以下命令:

    dir /b *.mpg |ppx2 -P 4 -I {} -L 1 ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"
    

    除此之外,dir /b *.mpg 获取我当前目录中的 .mpg 文件列表,| 操作员将此列表通过管道传输到 ppx2,然后构建一系列并行执行的命令;一次 4 个,由 -P 4 运算符在此处指定。 -L 1 操作符告诉 ppx2 一次只将我们目录列表的一行发送到 ffmpeg。

    之后,您只需编写命令行 (ffmpeg.exe -i "{}" -quality:v 1 "{}.mp4"),{} 就会自动替换目录列表的每一行。

    它并非普遍适用于所有情况,但比使用上面详述的批处理文件解决方法要容易得多。当然,如果您不处理文件列表,您也可以将文本文件或任何其他程序的内容通过管道传输到 pxx2 的输入中。

    【讨论】:

    • 最新的 xargs win32 端口现在运行良好(无论如何都包含在 git for windows 中)。
    • 这很好,只是它无法处理包含 unicode 字符的文件。有支持 unicode 文件的计划吗?谢谢。
    • @GökhanSever 在过去,我通过使用路径的“短名称”形式来解决这个问题,它看起来像 C:\PROGRA~1\WINDOW~3\MYPROG~1。 EXE文件。不漂亮,但很管用。
    【解决方案6】:

    使用START command

    start [programPath]
    

    如果程序的路径包含空格,请记住添加引号。在这种情况下,您还需要为打开的控制台窗口提供标题

    start "[title]" "[program path]"
    

    如果您需要提供参数,请将它们附加在末尾(在命令引号之外)

    start "[title]" "[program path]" [list of command args]
    

    使用 /b 选项避免打开新的控制台窗口(但在这种情况下,您不能使用 CTRL-C 中断应用程序

    【讨论】:

      【解决方案7】:

      我什么也做不了,最后我只使用了 powershell 来启动 bat 脚本.. 有时甚至 start cmd /c 也不知道为什么.. 我什至尝试了 start cmd /c notepad & exit 之类的东西

      start-Process "c:\BACKUP\PRIVATE\MobaXterm_Portable\MobaXterm_Portable.bat" -WindowStyle Hidden
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-30
        • 1970-01-01
        • 1970-01-01
        • 2013-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多