在非 cmdlet 的输出中搜索匹配项

在非 cmdlet 的输出中搜索匹配项

我显然对 PowerShell 的管道存在一些误解(我对该语言还很陌生)。

我尝试在 的帮助菜单中“grep”某个匹配项ssh-keygen。举一个简单的例子,我尝试查找包含“C”的每一行(我目前不关心大小写)。我尝试过:

ssh-keygen /? | Select-String "C"

问题是,ssh-keygen似乎试图消耗整个其余的命令,因为我得到了这个输出:

PS C:\Users\user\tests> ssh-keygen /? | Select-String "C"
Too many arguments.
usage: ssh-keygen [-q] [-b bits] [-C comment] [-f output_keyfile] [-m format]
. . .

但是,如果我尝试对我读入的(python 脚本)文件执行类似的操作,它会按我预期的方式工作:

PS C:\Users\user\tests> Get-ChildItem .\produce_image.py | Select-String "def"

produce_image.py:12:def draw_mandelbrot_with(canvas_dimensions: Tuple[int, int],
produce_image.py:38:def par_iterate_mandelbrot_with(canvas_dimensions: Tuple[int, int],
. . .

我猜想这与以下事实有关:它ssh-keygen是一个独立的可执行文件,而是Get-ChildItem一个 cmdlet,并且它们写入不同的流?或者类似的东西?

我只是想知道如何使用 PowerShell 搜索非 cmdlet 的输出。如能得到任何帮助,我将不胜感激。如果相关的话,我使用的是 PowerShell 7。

答案1

命令ssh-keygen /?将其输出发出至stderr(流 2),而管道(|)仅穿过stdout(流 1)。

你应该使用:

ssh-keygen.exe /? 2>&1 | Select-String "C"

2>&1重定向stderrstdout,以便可以传递给以下命令。

相关内容