如何等到cmd命令结束直到执行下一个任务?

时间:2017-01-12 15:58:50

标签: mean-stack autohotkey

我有一个使用 Ctrl + j 运行的脚本

  1. mongod(mongo服务器)
  2. mongo(mongo数据库)
  3. npm start(启动节点的网络服务器)
  4. 在Chrome中打开localhost:3000
  5. 每个任务必须在下一个任务开始之前就绪。例如,mongod是mongo服务器,因此如果mongo在服务器准备就绪之前启动,则会发生错误。

    这是我的剧本:

    // Start or stop mongod, mongo, node
    ^j::
        IfWinNotExist, npm // start everything up. This must be done in order, but the timing varies.
        {
            // Start the mongo server
            Run, mongod.exe
            WinGet, active_id, ID, A            // Get the id of the window
            GroupAdd, One, ahk_id %active_id%   // Add the window to a new Group so we can minimize them all later
            Sleep 1000   // This works, but the time varies. I'd like to replace it
    
    
            // Start the mongo database
            Run, mongo.exe
            WinGet, active_id, ID, A
            GroupAdd, One, ahk_id %active_id%
            Sleep 1000 // I'd like to replace this
    
            // Start the node server
            Run, cmd.exe
            Sleep 100
            send, cd webroot{\}{enter}
            Sleep 300
            send, npm start{enter}
            WinGet, active_id, ID, A 
            GroupAdd, One, ahk_id %active_id%
            Sleep 1000 // I'd like to replace this
    
            // Minimize all the cmd windows
            WinMinimize, ahk_group One
    
            // Always opens a new tab - but that's for another question...
            Run, chrome.exe http://localhost:3000
    
        } else {        // shut everything down if they're already running
            SetKeyDelay, 400
            ControlSend, ,^cy{enter}, npm
            SetKeyDelay, -1
            Sleep 1000
            WinClose, ahk_class ConsoleWindowClass
    
            SetTitleMatchMode 2
            ControlSend, ,^c, mongo
            Sleep 1000
            WinClose, ahk_class ConsoleWindowClass
    
            ControlSend, ,^c, mongod
            SetKeyDelay, 200,
            Sleep 1000
            WinClose, ahk_class ConsoleWindowClass
        }
    Return
    
    // Bonus for anyone that's interested in using this script.
    // Recycle the node server in the background
    !`::
        SetKeyDelay, 200
        ControlSend, ,^c y{enter} npm start{enter}, npm
    Return
    

    有没有办法等到服务完全启动后再转到下一个任务?

    <小时/> 编辑:更改了代码的结构,使重要部分更靠近顶部。

2 个答案:

答案 0 :(得分:1)

根据我的评论,请尝试:

    ...
    SetKeyDelay, 400
    ControlSend, ,^cy{enter}, npm
    SetKeyDelay, -1
    Sleep 1000
    WinClose, ahk_class ConsoleWindowClass

    WinWaitClose, ahk_class ConsoleWindowClass, , 3

    SetTitleMatchMode 2
    ControlSend, ,^c, mongo
    Sleep 1000
    WinClose, ahk_class ConsoleWindowClass

    WinWaitClose, ahk_class ConsoleWindowClass, , 3
    ...

H个

答案 1 :(得分:0)

在AutoHotkey脚本中,一些替换Sleep的方法是:
- WinWaitActive或WinWait(&#39;赢得等待存在&#39;) - 通过Run命令检索创建过程的PID e.g。

DetectHiddenWindows, On

Run, mongod.exe, , , vPID1
WinWaitActive, ahk_pid %vPID1%
WinGet, hWnd1, ID, ahk_pid %vPID1%

Run, mongod.exe, , , vPID2
WinWaitActive, ahk_pid %vPID2%
WinGet, hWnd2, ID, ahk_pid %vPID2%

;then later

WinMinimize, ahk_id %hWnd1%
WinMinimize, ahk_id %hWnd2%

AutoHotkey擅长做蝙蝠文件所做的一切, 例如,如果可以检索StdOut。 一般来说,您不需要打开cmd.exe并输入内容。

您可以使用cmd.exe(ComSpec)并指定路径/​​目标 此示例选择文件夹中的文件 (在Windows 7上测试过。)

vPathNotepad = C:\Windows\System32\notepad.exe
Run, %ComSpec% /c explorer.exe /select`, "%vPathNotepad%",, Hide

注意:需要在带有反引号的“运行”命令中转义文字逗号, 但是当分配变量时,请注意单词&#39;选择&#39;之后的反引号。以上,但不低于。

或者更容易遵循重写:

vPathNotepad = C:\Windows\System32\notepad.exe
vTarget = %ComSpec% /c explorer.exe /select, "%vPathNotepad%"
Run, %vTarget%,, Hide

如果您想要一个进程运行,并等待它终止, 在做任何其他事情之前,您可以使用RunWait而不是Run e.g。

vPath = C:\webroot\npm.exe ;or whatever the path is
RunWait, %vPath%

也可以在窗口隐藏/最小化的情况下启动进程。 e.g。

Run, %vPath%, , Hide
Run, %vPath%, , Min
RunWait, %vPath%, , Hide
RunWait, %vPath%, , Min

mongo和mongod,命令行还是GUI? 如果它们是GUI,则可能存在可以检测到的其他内容, 确定要做什么,例如从控件中检索文本。

[编辑:]
有用的链接:

在每个文件和(子)文件夹上运行命令行工具,甚至包含空格的文件夹 - AutoHotkey社区
https://autohotkey.com/boards/viewtopic.php?f=5&t=26819

关于Chrome,&#39; 始终打开一个新标签 - 但这是另一个问题...... &#39;,我写的一些功能:
Firefox / Chrome,获取标签名称/焦点标签 - AutoHotkey社区
https://autohotkey.com/boards/viewtopic.php?f=6&t=26947&p=126248#p126248