【问题标题】:powershell stdin pipes and redirectionpowershell stdin 管道和重定向
【发布时间】:2021-08-16 18:13:18
【问题描述】:

你好,所以我一直在制作一个小的跨平台脚​​本,我可以 curl 和管道进入 bash 和 Powershell。基本思想是服务器向解释器发送一个命令,然后它给出一个命令将所有输出重定向到标准输出。 bash 中的一个例子是

#some commands 
aplay rick.wav
cat -
random text
that will be redirected to stdout by cat... 
bash will never see this

然后我会将其通过管道传输到 bash 的标准输入

但对于 Powershell,我可以使用 cat test.ps1 | iexcat test.ps1 | powershell - 但不能在cat - 之类的命令中连续将标准输入重定向到标准输出,因为 cat 不会从标准输入中查找。

在尝试了很多随机的东西之后,似乎有很多 Windows 的标准输入类型,一种是键盘,另一种是管道

【问题讨论】:

  • 顺便说一句:Windows 不附带 cat 可执行文件,而在 PowerShell 中 cat 只是 Get-Content别名,它没有t 接受管道输入。

标签: bash powershell pipe cross-platform


【解决方案1】:

您可以通过-Command - (-c -) 将文本行传送到powershell.exe、Windows PowerShell CLI,它会一一解释。

这是一个内部 PowerShell的交互式演示;它与来自外部的管道输入(通过标准输入提供)相同:

# Repeatedly prompt for a line of input and execute it as a PowerShell command.
# Press Ctrl-C to exit.
& { while ($true) { Read-Host } } | powershell -noprofile -c -

注意:

  • -Command - 有问题的方面,特别是 跨越多行 的命令(然后需要 附加 Enter 击键/换行符才能使命令公认的),-File - 也是如此,其行为甚至更奇怪 - 请参阅 this answerGitHub issue #3223

另一个演示,通过管道到powershell -c - 的两行模拟外部标准输入

'get-date', 'get-item /' | powershell -noprofile -c -

这两个命令被执行并打印它们的输出; powershell.exe 然后退出,因为没有更多的标准输入可用;但是,如果使用不确定的 stdin 输入(类似于类 Unix 平台上的 cat -),PowerShell 进程也会无限期地保持活动状态。

【讨论】:

  • 啊,这确实有效,但如果我运行cat program.ps1 | iex,它会从键盘请求而不是从 stdin 的其余部分请求
  • @JesseTaube,是的,Read-Host 不会从标准输入读取(除非通过 PowerShell 的 CLI 调用脚本)。如果您想从外部提供 stdin 输入,请省略 Read-Host 循环,该循环仅用于模拟不确定的 stdin 输入。请看我的更新。如果这没有帮助,您需要澄清您的用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 2023-03-04
  • 1970-01-01
相关资源
最近更新 更多