2017-07-30 117 views
1

我是新使用PowerShell有人可以explaine我用圆括号为什么括号和点用于:为什么在这个PowerShell命令

(get-cluster).PreferredSite="SiteA" 

为什么不干脆:

get-cluster | set-preferredSite -Name SiteA 
+6

'just'是一个骗人的词;为什么要在同一个房间里放一张床,一张桌子和一个衣柜,只需要建立一个专门的步入式衣柜和一个专门的书房,一个专门的卧室和一个专门的通道就可以了。对象/属性语法来自.Net框架和C#,并且在许多语言(Java/Python/Ruby /等)中很常见。为每种类型的对象的每个属性构建专用的cmdlet将会花费更多的精力,并且只要您拥有像'Import-Csv'这样的未知属性的动态对象就会失败。 – TessellatingHeckler

+2

请注意,第一种语法仅可用,因为'Get-Cluster'返回一个“实时”对象,对其进行的更改将立即反映在群集配置中。这是一个相当笨拙的(也可能是危险的)设计,不要指望许多其他cmdlet让你这样做 –

回答

4

Set-preferredSite外观像cmdlet的(假设)名称,并且如TessellatingHeckler指出,实际上不可能为每个属性名称构建一个cmdlet(不考虑可以动态创建属性的事实你无法预知的名字)。

因此,你必须没有选择,只能使用PowerShell的语法的一个对象的属性,这通常需要使用表达,这是不CLI样(参数模式),但编程 - 的分配值类似语言的(表达模式)。

的PowerShell v3的+ 确实提供一个不那么“吵”语法与它的所谓操作语句;例如:

Get-Cluster | % PreferredSite 

这是更详细的等价物:

Get-Cluster | % { $_.PreferredSite } 

然而,在运行报表不支持分配,所以下面不工作:

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

我的猜想至于为什么不支持的是,它很少想要使用管道来设置每个项目的属性在潜在的大输入中设置为相同的值。

对于一个短小收集,(Get-Cluster).PreferredSite="SiteA"会做得很好,即使从Get-Cluster输出在存储器被收集作为一个整体第一(如果Get-Cluster超过1个对象,.PreferredSite每个项目在所访问的输出在PSv3 +中收集一个名为成员枚举的功能)。

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

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

注意如何:

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