2012-11-28 81 views
15

我見過很多使用這個腳本的示例腳本。最近,我看到它在腳本上automating TFS

[string] $fields = "Title=$($taskTitle);Description=$($taskTitle);Assigned To=$($assignee);" 
$fields += "Area Path=$($areaPath);Iteration Path=$($iterationPath);Discipline=$($taskDisciplineArray[$i]);Priority=$($i+1);" 
$fields += "Estimate=$($taskEstimateArray[$i]);Remaining Work=$($taskRemainingArray[$i]);Completed Work=$($tasktaskCompletedArray[$i])" 

從我可以告訴,$($taskTitle)似乎等同於$taskTitle。我錯過了什麼嗎?是否有任何理由使用括號和額外的美元符號?

+4

FYI在此* *情況下' 「區域路徑= $($ areaPath);」'的括號是不必要的。 ''Area Path = $ areaPath;「'會工作得很好。也就是說,簡單的變量擴展只能在雙引號字符串中起作用。當需要評估像$($ variable)這樣的表達式時,您需要parens。屬性)或$($ variable + 1)。 –

回答

22

語法有助於評估其中的表達式。

$arr = @(1,2,3) 

$msg1 = "$arr.length" 
echo $msg1 # prints 1 2 3.length - .length was treated as part of the string 

$msg2 = "$($arr.length)" 
echo $msg2 # prints 3 

你可以閱讀更多的http://ss64.com/ps/syntax-operators.html

+0

謝謝你一個非常明確的解釋。 – KevinD

1

爲了更背景資料補充Amith George's helpful answer

從我可以告訴,$($taskTitle)似乎等同於$taskTitle

事實上,在"..."的背景下,可擴展的字符串:

  • 你不需要$(...)簡單的變量引用$taskTitle$env:HOME

    • 有時,您必須(或可能選擇)使用表格${taskTitle}${env:HOME} - 即{...}圍繞標識符 - 以便從字符串中的後續字符中消除變量名。
  • 你需要$(...)別的

    • 訪問屬性;例如:
      "count is: $($var.Count)"
    • 嵌入表達式;例如: -
      "path prefix: $($var + '/')"
    • 嵌入整個命令(甚至可能多個的);例如:
      "file names: $(Get-ChildItem *.txt | Select-Object -ExpandProperty Name)"

簡而言之:

  • $(...)內 「...」 需要比簡單的變量引用任何其他並允許您將整個聲明"...";像往常一樣,當字符串進行評價時,該部分$(...)被替換爲(字符串化)輸出從嵌入語句(多個)。

  • 如果你不想去想的時候$(...)是,並不需要,您可以選擇總是使用它(例如,$($taskTitle)),但要注意它的繁瑣輸入和視覺「噪音」 。

    • 買者:有一個邊緣情況其中$($var)行爲是相同的$var/${var},即如果$var集合(實施[System.Collections.IEnumerable]),該恰好只包含單個項目 - 見下文PetSerAl的意見。
  • 除非引用變量/嵌入語句的值已經是一個字符串,它是使用.NET .ToString()方法字符串化,與支持文化敏感字串類型字符串化的顯着扭曲不變文化,其中,嚴格地講,就像是美國英語格式;例如,"$(1.2)"總是產生1.2,即使在培養其中,是十進制標記;詳見我的this answer

文檔

$(...)的正式名稱是次表達式運算,如(簡潔)在Get-Help about_Operators記錄,雖然解釋有沒有討論在運營商的具體使用可擴展字符串的上下文。

相反地,Get-Help about_Quoting_Rules,其中討論了字符串文字包括可膨脹的字符串,僅示出了實例在膨脹串的上下文$(...)使用

+1

順便說一句,''$ {variable}「和'」$($ variable)「'不總是返回相同的結果。 – PetSerAl

+1

這裏是例如:[要旨](https://gist.github.com/PetSerAl/d6336e2bb76388af59e45f5942fb6935)或[tio.run](https://tio.run/##[email protected]/[email protected]@Cc/ EghHsjanDtrYsQKJe7OMVFfKm8tdenoXSybjRt6CmZvCSfAZfoLlXxocUvpfbl4arcFSkNwyFe6bqV0NHIhyg/8Ds8wAzy66r92qZ @ 7FE7LBWZwjbp6aQAFm8x8YZwZUeR8BQ) – PetSerAl

+1

至於解釋:。這是$ {A} .GetType()FullName'和'$($'之間相差的直接後果).GetType()FullName';以及集合類型如何串化。 – PetSerAl

相關問題