在批处理文件中自动化命令行程序响应

0 投票
2 回答
10661 浏览
提问于 2025-04-17 05:33

我正在尝试运行一个Windows(XP)命令行程序,这个程序会提示我按'Enter'键或者输入'y'来继续。目前,我可以通过在批处理文件中这样运行程序来回应'y':

echo y | name_of_binary

但是我不知道怎么告诉命令行在需要的时候回应'Enter'或者'y'。如果程序出现了类似“按Enter继续”的提示(虽然这种提示不多,但还是会造成问题),如果我继续输入'y',程序就会陷入一个奇怪的循环,无法接受任何输入(会不停地显示“按Enter继续”)。如果我能先输入一个'Enter',然后再输入'y',可能就能解决这个问题,但我尝试的所有方法都无法模拟'Enter'键的按下。

最终,我是通过Python中的os.system()来调用这个批处理文件。如果有办法让Python运行这个程序(通过os.system(name_of_binary)),并且能回应这些提示,那就太好了。我已经尝试过os.system(echo y | name_of_binary),结果和批处理文件的表现一样(这也是应该的)。我是不是应该换个方法,或者能通过修改我现在使用的'echo ...'命令来解决这个问题呢?

2 个回答

0

可以看看 Windows版的Expect

这就是你需要的全部。关于Expect有很多书籍和教程(包括示例)。你可以用你喜欢的搜索引擎来查找,但上面提到的Activestate网站上有你需要的所有信息。虽然你找到的教程和书籍可能主要是针对Unix系统的,因为Expect最初就是在那儿诞生的,但Windows上的Expect其实也差不多。

Expect可以帮助你在批处理脚本中自动化命令行的交互操作。

2

在批处理文件中,输出一个换行的标准方法是用 echo/,并且这一行不能有多余的空格。如果你想输出一个换行后再跟上 'Y',可以试试这个方法:(echo/&echo Y) | name_of_binary(注意 echo/& 中间不要加空格)。

如果这个方法不奏效,可能是因为在第一个换行和 'Y' 后面插入了换行符。通过 (echo/&echo Y) 生成的字节序列是:CrLfYCrLf,其中 Cr 是回车符,Lf 是换行符。

如果之前的方法有问题,你可以用这个批处理文件创建一个只包含 CrY 字节的文件:

@echo off
echo/> EnterY.txt
(
echo e101
echo 59
echo w
echo q
) | debug EnterY.txt > nul

然后你可以这样执行你的命令:name_of_binary < EnterY.txt

附注 - 请注意,echo y | name_of_binary 会生成 y CrLf,也就是说在 y 后面会有一个空格;正确的写法应该是 echo y| name_of_binary

撰写回答