我显然对 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,以防万一。
该命令
ssh-keygen /?
将其输出发送到stderr
(流 2),而管道(|
)仅通过stdout
(流 1)。你应该使用:
将
2>&1
重定向stderr
到stdout
,因此可以将其传递给以下命令。