Powershell:读取主机中出现意外回声

Giu*_*ini 1 powershell batch-file

我正在尝试在 powershell(W10-64 位上的 5.1)中编写一个简单的文本操作过滤器。我的目标是将其用作批处理(.bat)中管道的一部分,例如:

command1.exe | powershell "...my filter..." | command2.exe
Run Code Online (Sandbox Code Playgroud)

我面临一个奇怪的问题:“Read-Host”cmdlet 总是回显其输入。例子:

echo 1234 | powershell "$a=Read-Host"
Run Code Online (Sandbox Code Playgroud)

产生

1234
Run Code Online (Sandbox Code Playgroud)

(注意:请参阅PowerShell:在 Read-Host 中禁用回显)。

如何避免这种意外的回声?有没有其他方法可以在 powershell 中读取 STDIN?

注2:我知道我可以在 powershell 内完成所有管道工作,但由于多种原因,这不适合我的情况。我想要的是一个适合成为“.bat”中管道的一部分的“通用过滤器”。并且,不,存储中间数据的临时文件不是一个选项。

编辑:正如“Compo”所指出的,MS 文档这样描述了 Read_Host:

您无法通过管道将输入输入到此 cmdlet

因此,尝试让它发挥作用是没有意义的。

EDIT2:正如“mklement0”所解释的,“[Read_Host]确实接受管道,即来自外部的标准输入,例如当提供给PowerShell的CLI时”。真正的问题是它的目的是简化用户输入,而不是提供对标准输入的通用访问。

实际问题是:是否有其他方法可以在 powershell 中读取 STDIN?

Mat*_*sen 5

有没有其他方法可以在 powershell 中读取 STDIN?

这已经发生了,您只需要知道如何挂钩它 - 例如使用自动枚举$input器变量:

C:\> echo "camelCase" |powershell -Command "$input |ForEach-Object ToUpper"
CAMELCASE
Run Code Online (Sandbox Code Playgroud)

由于 PowerShell 和 CMD 使用略有不同的语法,并且转义可能会有点困难,因此我强烈建议将过滤器放入脚本文件中并调用这些:

# myUpperCaseFilter.ps1
$input |ForEach-Object ToUpper
Run Code Online (Sandbox Code Playgroud)
# script.bat
command1.exe |powershell -File path\to\myUpperCaseFilter.ps1 |command2.exe
Run Code Online (Sandbox Code Playgroud)