为什么圆括号用于此powershell命令

时间:2017-07-30 22:06:14

标签: windows powershell windows-server-2016

我是Powershell的新人可以向我解释为什么使用圆括号和点数:

(get-cluster).PreferredSite="SiteA"

为什么不呢:

get-cluster | set-preferredSite -Name SiteA

1 个答案:

答案 0 :(得分:4)

Set-preferredSite看起来像 cmdlet 的(假设)名称,并且正如TessellatingHeckler指出的那样,为每个人构建cmdlet实际上是不可能的属性名称(不考虑可以动态创建的属性,其名称无法预测)。

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

PowerShell v3 + 通过其所谓的操作语句提供更少“嘈杂”的语法; e.g:

Get-Cluster | % PreferredSite

这相当于更详细:

Get-Cluster | % { $_.PreferredSite }

但是,操作语句不支持赋值,因此以下内容不起作用:

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

猜测关于为什么不支持这种情况,很少想要使用管道将潜在大型输入集中每个项目的属性设置为相同 value。

对于小型集合,(Get-Cluster).PreferredSite="SiteA"会很好,即使Get-Cluster的输出首先在内存中收集(如果Get-Cluster输出多个对象,.PreferredSite在PSv3 +集合中的每个项目上访问,这是一个名为成员枚举的功能。“

对于大型集合,请将%ForEach-Object)与自定义脚本块一起使用:

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

请注意:

  • { ... }内的语句是作业表达式
  • $_是自动变量,它引用每次迭代中的输入对象。