我试图将. exe文件的结果重定向到.txt文件中,但我在windows cmd中使用的命令
test.ext < input.txt > output.txt
字符串
didn not correctly show what input file input:
Enter top, an integer between 3 and 29 (including): Enter side, an integer between 2 and 20 (including): Enter 0 for left-tilt or 1 for right-tilt of the side:
###
#@#
#@#
###
The number of characters on the perimeter: 10.
The number of characters in the interior: 2.
The number of characters of the parallelogram: 12.
型
在我的预期中,输出应该是这样的:
Enter top, an integer between 3 and 29 (including): 3
Enter side, an integer between 2 and 20 (including): 2
Enter 0 for left-tilt or 1 for right-tilt of the side: 0
###
#@#
#@#
###
The number of characters on the perimeter: 10.
The number of characters in the interior: 2.
The number of characters of the parallelogram: 12.
型
就像.exe文件显示我当我运行它。
有没有简单的方法来实现我想要的?
1条答案
按热度按时间dsekswqp1#
tl;dr
<
重定向或通过管道输入(|
))而不是通过 * 用户交互输入 * 提供时。两个方面发挥作用:
***(a)*如果(默认情况下)交互式提示被认为是一个纯粹的交互式功能,与应用程序的(stdout) 输出 * 无关:
***(B)**如果应用程序希望生成更像交互式会话的 * 抄本 * 的输出,同时显示提示消息和响应:
不幸的是,您的可执行文件没有使用任何方法,并做出以下选择组合:
例如,* 批处理文件 * 会显示此行为**,您可以使用以下示例批处理文件进行验证:
字符串
标记为
sample.cmd < input.txt > output.txt
,input.txt
中有3行输入,包含a
、b
和c
,您将在output.txt
中看到以下输出:型
也就是说,提示消息在没有换行符的情况下连接在一起,并且缺少响应。
PowerShell的 * 行为是特定于平台的,但a(b)解决方案是可能的任何一种方式:
重要:以下内容仅适用于从 * 外部 * 通过其 CLI(
powershell.exe
用于Windows PowerShell,pwsh
用于PowerShell(Core)7+)调用PowerShell代码,因为只有这样Read-Host
才会从 * 重定向的stdin 读取响应。因此,在类似 Unix 的平台上,它也适用于通过shebang行在PowerShell中实现的可直接执行的shell脚本。Read-Host
调用获得所需的行为(b),如以下示例代码所示:型
>
)捕获的;解决方法是 * 单独 * 打印提示消息,使用Write-Host
及其-NoNewLine
开关:型
比如说,从
cmd.exe
转换为powershell -ExecutionPolicy Bypass -File sample.ps1 < input.txt > output.txt
,在input.txt
中有3行输入,包含a
、b
和c
,你会在output.txt
中看到以下输出:型
也就是说,这相当于行为(b):提示消息和stdin提供的响应都被打印到stdout[1],因此通过
>
捕获。PowerShell还支持(a)解决方案,但需要额外的努力:
型
使用与上面相同的示例调用,您现在可以得到:
型
也就是说,这相当于行为(a):由于stdin重定向(
<
),提示消息和stdin提供的响应都没有被打印,因此不是>
捕获的一部分。注意事项:
C#实现(a)
型
(B)的C#实现
型
[1]也许令人惊讶的是,
Write-Host
也打印到标准输出,即使PowerShell-* 内部 * 它被设计为 * 绕过 * PowerShell的类似 * 成功 * output stream。事实上-不幸的是-默认情况下,PowerShell的所有 *(六个!)输出流都Map到外部调用者看到的标准输出流-参见GitHub issue #7989。