2017-07-30 114 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' } 

注意如何:

  • 的語句中{ ... }是一個賦值表達式
  • $_是指在每次迭代中引用輸入對象的自動變量。