【问题标题】:Automating responses to command line program in batchfile自动响应批处理文件中的命令行程序
【发布时间】:2011-11-03 03:43:48
【问题描述】:

我正在尝试运行提示输入“Enter”或“y”以继续的 Windows (XP) 命令行程序。目前,我可以通过运行程序来响应“y”: echo y | name_of_binary 在批处理文件中。

我不知道如何告诉 shell 在需要时用“Enter”或“y”响应。如果它进入“按 Enter 继续”类型的提示(其中没有很多,但足以引起问题)并回显“y”,它会卡在一个奇怪的循环中并且不会接受任何输入(它会喷出数千个“按回车键继续”)。如果我可以先回显一个 Enter,然后依次回显一个“y”,那可能会奏效,但我尝试回显“Enter”按键的所有方法都不起作用。

我最终在 Python 中通过os.system() 调用这个批处理文件。如果有办法让 Python 运行二进制文件(通过 os.system(name_of_binary)?)并响应提示,那将是理想的。我已经尝试过os.system(echo y | name_of_binary),它的行为方式与批处理文件相同(应该如此)。我应该使用不同的方法,还是可以通过修改我当前使用的“echo ...”命令来解决这个问题?

【问题讨论】:

  • 使用pexpect python模块,你可以在批处理文件提示时发送你想要的响应
  • 同意,pexpect('expect'python 模块)可能更合适,因为 OP 已经在使用 python。简而言之,expect 是做到这一点的正确方法。它就是为此目的而建造的。
  • @dave35:如果您仍然对这个主题感兴趣,请参阅this question,它展示了一种在批处理中模拟 pexpect Phyton 模块的方法。寻找 Aacini 的答案。

标签: python windows batch-file cmd


【解决方案1】:

批量输出 Enter 的标准方法是 echo/ 在一行中,没有额外的空格。要输出一个 Enter 后跟 'Y',你可以试试这个:(echo/&echo Y) | name_of_binary(不要在echo/& 中插入空格)。

如果这不起作用,那是因为在第一个 Enter 之后和 Y 之后都插入了 LineFeed 字符。(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

PS - 请注意echo y | name_of_binary生成y CrLf,即y后面的一个空格;那应该是echo y| name_of_binary

【讨论】:

  • +1,虽然我不喜欢调试技术,因为它不再受支持
  • @jeb:虽然你是对的,但任何人都可能从this site得到DEBUG。
【解决方案2】:

查看Expect for Windows

这就是你所需要的。有几本关于 Expect 的书籍,以及许多教程(包括示例)。您最喜欢的搜索引擎是您最好的朋友,但上面给出的 Activestate 站点 URL 拥有您需要的一切。虽然您可能会在教程和书籍方面找到以 Unix 为中心的内容,而这正是期望的起源,但 Windows 的期望并没有太大的不同。

Expect 将允许您自动化批处理脚本中的命令行交互。

【讨论】:

  • 对不起。如果我理解正确,Expect 可以提供远程计算机会话输入所需的响应,但我认为它不能用于本地命令。 Expect 和 command 之间的双向通信是如何建立的?这将需要双向管道和并发执行。也许我错过了什么?
  • @Aacini,expect 将模拟(粗略地说)用户交互性,就好像输入是由本地连接的键盘提供的一样。已经在 Unix 命令行上广泛使用它来进行非常相似的活动,所以我很确定。唯一需要检查的就是看看它在 Windows 端的功能是否相似,我没有理由怀疑它确实如此:-)
  • 要使用 DOS 命令行程序来为 W​​indows 中的第二个程序提供输入,第一个程序必须建立双向管道并通过 START 执行第二个管道,否则第二个程序将按顺序运行,直到第一个程序结束。据我所知,即使是通常的输入管道也无法建立 START 命令。您确定带有 pexpect 模块的 Python 程序可以做到这一点吗?您能否向我们展示如何在 Unix 中以这种方式控制第二个程序的示例?谢谢。
  • 我在 Wikipedia 中找到了答案:“Expect 是一个 Unix 自动化工具……它使用 Unix 伪终端透明地包装子进程……”“在 Unix 中, pseudo-terminal 是一个伪设备对,它提供了一个没有关联设备的文本终端接口。相反,一个进程承担了伪终端会话的硬件角色”。 Windows 中不存在等效的概念。本站:noah.org/wiki/Pexpect 确认此结论:“Pexpect 目前不适用于标准 Windows Python”。
猜你喜欢
  • 1970-01-01
  • 2011-03-28
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多