2010-06-07 68 views
0

我需要一些帮助,写什么应该是一个相当基本的.BAT文件。批处理文件等待其他程序加载/初始化,然后执行命令?

我打开我的主要程序,但该程序大约需要20secs加载和初始化。

我还有一个命令行API我可以执行与该上述程序进行交互,但很明显,直到上述程序被加载并初始化有没有试图点。

如果程序没有运行命令行API返回一个字符串,指出正是这一点 - 否则它只是工作并退出。简单。

所以我要等到上述加载/它射击我的API指令(S)之前进行初始化。

可能在那里放置一个睡眠/等待,但我想要更稳固的东西。约20秒等待不一定一致。

任何方式直到响应是令人满意的反复执行命令行API,然后退出?

J

回答

0

当然。但是,您应该考虑使用适当的退出代码而不是消息字符串来表示加载尚未完成。除非输出从未在本地化。

无论如何,在这里我们去:

:loop 
yourcommand.exe | findstr MAGIC STRING SIGNIFYING LOADING NOT YET COMPLETE >nul 2>&1 
if not errorlevel 1 goto loop 

这仅仅只要findstr有返回0作为其退出代码重试(这意味着它找到的字符串)。

两个问题,虽然:

  1. 这是一个资源猪。你应该把一个睡在那里试试每隔一秒左右,而不是不断地做这件事:

    ping -n 1 ::1 >nul 2>&1 
    
  2. 虽然这将运行预期命令最多一次(最终),它吃,因为它所有的输出管它到findstr。除非你手头这是难以解决的有tee(它会涉及for环比输出和检查每一行findstr - 你不想去那里,相信我

    的选择可能是,如果有。一个让你的命令检查然后在循环之后通过调用发出实际命令的方式(当程序被发现工作时它就存在),然后你可以愉快地记录所有的输出,但是如果你正在说的程序在退出循环和启动该程序与实际的命令你有另一个问题之间的下降

+0

好的,在正确的轨道上,我喜欢它我可以问什么“2>&1> “ 是在做? – 2010-06-08 07:36:23

+0

将错误输出(流2)重定向到流1(stdout)要发往的相同位置。在这种情况下,NUL。如果你只是重定向到NUL,它实际上并不需要,现在只是肌肉记忆。但是如果你重定向到文件中,你不能执行'foo 1> a.txt 2> b.txt',因为这样只有一个流可以进入文件(你不能打开它来写两次)。事后看来,我不认为'findstr'会在这里写下任何东西来表达 - 再一次,重定向都是肌肉记忆对我来说:-) – Joey 2010-06-08 10:17:08