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

ali*_*cef 1 windows powershell windows-server-2016

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

(get-cluster).PreferredSite="SiteA"
Run Code Online (Sandbox Code Playgroud)

为什么不只是:

get-cluster | set-preferredSite -Name SiteA
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 5

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

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

PowerShell v3+确实通过其所谓的操作语句提供了一种不那么“嘈杂”的语法;例如:

Get-Cluster | % PreferredSite
Run Code Online (Sandbox Code Playgroud)

这相当于更详细的:

Get-Cluster | % { $_.PreferredSite }
Run Code Online (Sandbox Code Playgroud)

但是,操作语句不支持assignments,因此以下不起作用:

Get-Cluster | % PreferredSite = 'SiteA' # !! Does NOT work.
Run Code Online (Sandbox Code Playgroud)

我对为什么不支持的猜测是,很少希望使用管道将潜在大输入中的每个项目的属性设置为相同的值。

对于较小的集合,(Get-Cluster).PreferredSite="SiteA"即使输出作为一个整体首先Get-Cluster收集在内存(如果Get-Cluster输出超过 1 个对象,.PreferredSite则在 PSv3+ 中对集合中的每个项目进行访问,该功能称为成员枚举)。

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

Get-Cluster | % { $_.PreferredSite = 'SiteA' }
Run Code Online (Sandbox Code Playgroud)

注意方法:

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