启动程序,等到它输出某个字符串,然后继续

启动程序,等到它输出某个字符串,然后继续

我希望我的批处理脚本运行一个不会终止的批处理脚本,然后再运行几个会终止的批处理脚本,然后关闭第一个批处理脚本。

问题是,我启动的第一个批处理脚本需要先建立连接,然后才能开始运行其他脚本,并且要确定何时完成,我需要观察我启动的第一个脚本的输出,以查找指示连接已建立的字符串。

用伪代码来说,

start first script
wait for first script to output specific string
while the first script remains running:
    run several other scripts
close the first script

此字符串仅在打印了前几行之后才会出现。行数和所需时间都可能有所不同。字符串不会一次性全部输出。我无法修改此脚本。

期望的结果是这样的:

C:\>first_batch_script.bat
Some line
Doing a thing
Winning the points
The Sims did this joke better
Connection established
certain string
C:\>other_batch_script.bat
other_batch_script is done!
C:\>another_batch_script.bat
another_batch_script is done!
C:\>REM kill first_batch_script.bat

这是我正在尝试的代码:

FOR /f "tokens=* delims=" %%L IN ('first_batch_script.bat ^| find "certain string"') DO echo %%L
call other_batch_script.bat
call another_base_script.bat
REM kill first_batch_script.bat

使用FOR /f似乎很有希望,但当我运行这个批处理脚本时,它运行得相当慢,然后似乎挂起了。无论如何,即使它运行了,我也没有看到一个很好的方法来打破循环并继续执行我的代码

使用START /WAIT没有帮助,因为我启动的第一个脚本没有(也不应该)终止。使用任何类型的计时方法都行不通,因为建立连接所需的时间可能相差很大。

简而言之:

如何监视批处理脚本的输出,并且仅在看到某个字符串后才执行其他脚本?

答案1

如果我正确理解了您的要求,那么 for /f它将无法工作,因为它会等到内部进程结束。您可以尝试在文件上进行同步,如下例所示:(
这将是您所依赖的脚本文件,例如wait.bat):

@echo off

:loop
timeout /t 1
(type res.txt |find "trip")  > nul 2>&1
if errorlevel 1 goto loop
echo I can go!

在 cmd 窗口中启动它,然后打开第二个 cmd(相同目录)并运行(再次作为示例):
ping localhost |find "trip" >res.txt
只有在 ping 输出“trip”后,您才应该看到“I can go”(是的,它不久后就退出了,但您的主脚本/进程不需要)

还请注意,通常你会先启动主脚本!这也确保同步文件被清空。

您还没有说清楚您到底需要等待什么——也许有更直接的方法来检查?(例如,使用 netstat 检查打开的连接)?

答案2

听起来你用错了方法。有些运算符既可以用来将输出通过管道传输到某个程序,也可以用来将某个程序通过管道传输到某个程序。

第二种方法将允许您控制命令行程序,例如 FTP.exe,并且根据您所写的内容,听起来这正是您所需要的。

创建一个包含您需要自己执行的所有按键的文本文件,在需要输入时按回车键,以便每个命令都出现在自己的行上。

例如input.txt

MyUsername
qwertyPasswd
y
2
3
quit

上面会先输入MyUsername并按回车键。然后它会写第二行,等等。

现在,启动您的程序并将文本文件导入其中:

C:\>ftp.exe <input.txt

命令细目:

C:\>ftp.exe这是您可以运行的一个程序的示例。

<input.txt注意 < 字符,这将输入 input.txt 的内容并将其视为用户输入。

请注意,如果程序不期望键盘输入,管道将等待提供键盘输入。

相关内容