我希望我的批处理脚本运行一个不会终止的批处理脚本,然后再运行几个会终止的批处理脚本,然后关闭第一个批处理脚本。
问题是,我启动的第一个批处理脚本需要先建立连接,然后才能开始运行其他脚本,并且要确定何时完成,我需要观察我启动的第一个脚本的输出,以查找指示连接已建立的字符串。
用伪代码来说,
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 的内容并将其视为用户输入。
请注意,如果程序不期望键盘输入,管道将等待提供键盘输入。