我显然对 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
重定向stderr
到stdout
,以便可以传递给以下命令。