You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批处理调用第三方控制台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来模拟输入:
    # 模拟依次输入:回车(空行)、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}")
    
    也可以用AutoHotkey这类第三方工具来编写更灵活的按键模拟脚本,效果和手动操作完全一致,能避开ReadKey()的限制。

内容的提问来源于stack exchange,提问作者hiichaki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 21:17:41