为什么在这个 powershell 命令中使用括号

why Parentheses used for in this powershell command

我是 Powershell 的新手,有人可以向我解释为什么括号和点用于 :

(get-cluster).PreferredSite="SiteA"

为什么不只是 :

get-cluster | set-preferredSite -Name SiteA

Set-preferredSite 看起来像 cmdlet 的(假设的)名称,而且,正如 TessellatingHeckler 指出的那样,实际上不可能构建一个每个 属性 名称的 cmdlet(抛开可以动态创建其名称无法预测的属性这一事实)。

因此,您别无选择,只能使用 PowerShell 的语法为对象的 属性 赋值,这通常需要使用 表达式 ,即不像 CLI(参数模式)但像编程语言(表达式模式)。

PowerShell v3+ 确实 通过其所谓的 operation 语句 提供了一种“噪音”较小的语法;例如:

Get-Cluster | % PreferredSite

这相当于更详细的:

Get-Cluster | % { $_.PreferredSite }

但是,操作语句不支持赋值,所以下面的不工作:

Get-Cluster | % PreferredSite = 'SiteA' # !! Does NOT work.

猜测 不支持的原因是很少有人想使用管道来设置潜在大输入中每个项目的 属性设置为 相同 值。

对于较小的集合,(Get-Cluster).PreferredSite="SiteA" 会很好,即使 Get-Cluster 的输出首先被收集在内存中 作为一个整体 (如果Get-Cluster 输出超过 1 个对象,.PreferredSite 在 PSv3+ 集合中的 每个项目 上访问,一个称为 member-access enumeration) 的功能。

对于大型集合,使用 % (ForEach-Object) 和自定义脚本块:

Get-Cluster | % { $_.PreferredSite = 'SiteA' }

注意方式:

  • { ... }里面的语句是赋值表达式.
  • $_ 是指每次迭代中手头输入对象的自动变量。