我试图将.exe文件的结果重定向到.txt文件中,但是我在Windows cmd中使用的命令
test.ext < input.txt > output.txt
未正确显示输入文件输入的内容:
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 文件时所显示的那样。
有什么简单的方法来实现我想要的吗?
tl;博士
行为归结为给定的可执行文件选择如何处理(默认情况下)交互提示,当他们的响应是通过标准输入提供时而不是通过用户交互输入的内容。
结果是获得不同行为的唯一方法是修改可执行文件。
有两个方面发挥作用:
交互式提示的消息是否写入stdout与直接写入终端,以及如果标准输入重定向,即是否从标准输入读取响应,是否完全打印消息。
response 是否写入 stdout 与 直接写入终端 或 根本不写入(如果已通过 stdin 提供响应)。
理想情况下,您希望给定的可执行文件选择以下组合之一如果标准输入被重定向,基于以下设计选择:
:
既不打印打印
both它将提示消息写入标准输出,同时
由于提示消息本身没有尾随换行符 - 鉴于应在同一行上
涉及尾随换行符(换行符))意味着所有(连续的)提示消息出现在同一行。
,例如表现出此行为,您可以使用以下示例批处理文件进行验证:
@echo off
set /P V1="Prompt 1: "
set /P V2="Prompt 2: "
set /P V3="Prompt 3: "
echo Values provided: [%V1%] [%V2%] [%V3%]
作为
sample.cmd < input.txt > output.txt
调用,在
input.txt
中包含 3 行输入,其中包含
a
、b
和 c
,您将在 output.txt
中看到以下输出:Prompt 1: Prompt 2: Prompt 3: Values provided: [a] [b] [c]
即提示信息无换行连接,缺少响应。
PowerShell 的是特定于平台的: 重要:以下内容仅适用于从
外部通过其CLI调用PowerShell代码(powershell.exe
适用于Windows PowerShell,
pwsh
适用于PowerShell(Core)7+)),因为只有这样 Read-Host
才会从重定向的 stdin 读取响应。因此,在类似 Unix 的平台上,它也适用于通过 shebang 行在 PowerShell 中实现的直接可执行 shell 脚本。 在类 Unix 的平台上,您将通过常规
Read-Host
调用获得所需的行为 (b),如以下示例代码所示:
$values =
1..3 | ForEach-Object {
Read-Host -Prompt "Prompt ${_}"
}
"Values provided: $($values.ForEach({ "[$_]" }))"
直接打印到控制台,因此
>
);解决方法是使用 Write-Host
及其 -NoNewLine
开关打印提示消息separately:
$values =
1..3 | ForEach-Object {
Write-Host -NoNewLine "Prompt ${_}: "
Read-Host
}
"Values provided: $($values.ForEach({ "[$_]" }))"
例如,从
cmd.exe
作为 powershell -ExecutionPolicy Bypass -File sample.ps1 < input.txt > output.txt
调用,在 input.txt
a
、
b
和
c
,您会在
output.txt
中看到以下输出:
Prompt 1: a
Prompt 2: b
Prompt 3: c
Values provided: [a] [b] [c]
也就是说,这个金额的行为 (b):提示消息和标准输入提供的响应都被打印到标准输出并因此被捕获。