为了将输入传递给Get-Member通过参数(而不是通过管道),您必须明确使用-InputObject 参数:
Get-Member -InputObject (Get-Process -Name chrome)
还要注意 (...) 在这里就足够了 - 不需要 $(...)。[1]
然而,一个重要的警告是,如果Get-Process 返回多个 进程,它们将被收集到一个数组 中,然后Get-Member 将报告数组的属性,而不是它的元素。
只有通过管道,输入才被单独考虑,这在Get-Member的情况下意味着distinct集报告了输入类型,Get-Process 输入根据定义只有一个不同类型,[System.Diagnostics.Process]。
虽然在 Get-Member 的情况下,pipeline 和 argument 输入之间的区别很有帮助 - 它允许您检查 collection 的属性如果您使用
-InputObject 参数,则类型自己 - 在大多数情况下,它无用并且会造成混淆,因为大多数 cmdlet 仅在集合的单个元素 - 如果您通过 -InputObject 传递集合,这通常不起作用;见this GitHub issue。
至于你尝试了什么:
如果您不将-InputObject 与Get-Member 显式结合使用,您的参数将绑定到-Name 参数(用于查找特定类型成员),这意味着Get-Member 缺少输入对象,这就是它抱怨的原因。
(请注意,如何将位置参数绑定到其参数取决于每个 cmdlet,并且 cmdlet 甚至可以选择根本不支持位置参数。)
通过查看Get-Member -? 或Get-Command -Syntax Get-Member 的语法图,您可以知道Get-Member 将第一个位置参数绑定到-Name,如Get-Member -? 或Get-Command -Syntax Get-Member:
PS> Get-Command -Syntax Get-Member
Get-Member [[-Name] <String[]>] [-InputObject <psobject>] ...
参数name -Name 周围的[...] 表示指定参数name 是可选的,即给出的第一个positional 参数绑定到它。
相比之下,-InputObject 参数名没有包含在[...] 中,表示它不能进行位置绑定,要绑定到它的参数必须在参数名之前。 p>
-InputObject 参数 - 通常也是在这种情况下 - 也受 管道输入 的约束,并且通过管道提供输入更为典型(并且通常是唯一有意义的方式,如上所述)。
注意语法图不指出哪些参数(可以有多个)接受管道输入;改变这是this GitHub feature request的主题。
有关如何阅读 PowerShell 语法图的更多信息,请参阅about_Command_Syntax。
[1] PowerShell 没有 Bash 样式的命令替换。您可以将命令和表达式用作参数,只需将它们包含在(...) 中,然后按原样使用生成的对象(不执行 Bash 样式的 shell 扩展);仅当您想传递 多个 语句的输出,或在 expandable strings ("...") 内部或通过管道发送复合语句的输出(例如,foreach (...) { ... })时,您才需要 $(...), the so-called subexpression operator。