PowerShell脚本为何无法读取管道输入?如何实现管道读入?
问题原因
- PowerShell的管道传递的是对象流,而非传统的字节/文本流。你的脚本直接调用.NET的
[System.Console]::OpenStandardInput()读取标准输入,这和PowerShell的管道机制不兼容。 - 执行
type myfile.txt | ./myscript.ps1时,PowerShell会将文件内容拆分为字符串对象存入管道,但不会把这些对象映射到.NET的标准输入流中,导致StreamReader无法读取管道内容,转而等待键盘输入。
解决方法
方法1:使用PowerShell原生管道读取(推荐)
利用PowerShell的原生机制读取管道输入,有两种常用方式:
方式A:通过$input自动变量
foreach ($line in $input) { "Processed: $line" }
方式B:通过process脚本块(适合复杂处理场景)
process { "Processed: $_" }
上述两种写法都能直接读取管道传递的每一行内容,执行type myfile.txt | ./myscript.ps1即可正常工作。
方法2:适配.NET StreamReader的读取方式
如果坚持使用.NET的StreamReader,需要先将PowerShell的对象流转换为文本流,在执行命令时添加Out-String -Stream:
type myfile.txt | Out-String -Stream | ./myscript.ps1
Out-String -Stream会把管道中的字符串对象转换为逐行的文本流,让StreamReader能正确读取到管道内容。
内容的提问来源于stack exchange,提问作者Rexxowski
相关产品推荐
相关产品推荐

