首页 > 解决方案 > Powershell:读取主机中的意外回声

问题描述

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

command1.exe | powershell "...my filter..." | command2.exe

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

echo 1234 | powershell "$a=Read-Host"

生产

1234

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

我怎样才能避免这种意想不到的回声?有没有其他方法可以在 powershell 中读取 STDIN?

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

编辑:正如“Compo”所指出的,MS 文档对 Read_Host 进行了说明:

您不能将输入通过管道传输到此 cmdlet

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

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

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

标签: powershellbatch-file

解决方案


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

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

C:\> echo "camelCase" |powershell -Command "$input |ForEach-Object ToUpper"
CAMELCASE

由于 PowerShell 和 CMD 使用稍微不同的语法并且可能有点难以逃脱,我强烈建议将您的过滤器放在脚本文件中并调用它们:

# myUpperCaseFilter.ps1
$input |ForEach-Object ToUpper
# script.bat
command1.exe |powershell -File path\to\myUpperCaseFilter.ps1 |command2.exe

推荐阅读