批处理调用第三方控制台EXE重定向输入报错的问题咨询
问题根源与排查解决方向
这个报错的核心原因其实很明确——你调用的第三方config.exe没有使用标准的控制台输入流来获取用户输入,而是用了Console.ReadKey()这类直接读取键盘按键的API。
为什么管道重定向会失效?
当你用(echo. echo someText echo someOtherText) | call config.exe remove或者echo. | call config.exe remove这种管道方式时,程序的输入被重定向成了管道流,而不是直接的控制台键盘输入。ReadKey()是专门用来捕获物理按键操作的API,它没法从管道/重定向流里读取内容,所以就会抛出你看到的Cannot read keys when either application does not have a console or when console input has been redirected错误。
具体排查与解决方向
- 确认程序的输入交互方式:手动运行
config.exe remove,仔细观察三次提示的内容。如果提示是让你按某个按键(比如“按Y确认删除”“按任意键继续”),那基本可以确定它用了ReadKey();如果是让你输入文本后回车,那可能是其他兼容问题,但结合报错来看前者概率更高。 - 查找程序的非交互参数:很多第三方控制台工具都会提供静默/批量操作的参数,比如
/silent、/quiet、/force,或者针对remove命令的专用参数(比如remove /confirm:yes)。你可以尝试运行config.exe /?或者config.exe remove /?,看看有没有相关的非交互模式说明,这是最省心的解决方案。 - 用工具模拟真实键盘输入:如果程序确实没有非交互参数,那只能放弃管道重定向,改用模拟物理按键的工具。比如用PowerShell结合
SendKeys来模拟输入:
也可以用AutoHotkey这类第三方工具来编写更灵活的按键模拟脚本,效果和手动操作完全一致,能避开# 模拟依次输入:回车(空行)、someText+回车、someOtherText+回车 $wshell = New-Object -ComObject wscript.shell # 启动程序 $wshell.Run("config.exe remove") # 等待程序加载提示,时间可能需要根据实际情况调整 Start-Sleep -Milliseconds 500 $wshell.SendKeys("{ENTER}") Start-Sleep -Milliseconds 200 $wshell.SendKeys("someText{ENTER}") Start-Sleep -Milliseconds 200 $wshell.SendKeys("someOtherText{ENTER}")ReadKey()的限制。
内容的提问来源于stack exchange,提问作者hiichaki
相关产品推荐
相关产品推荐

