2012-11-28 15 views
15

Bunu kullanan bir dizi çevrimiçi komut dosyası gördüm. En son, automating TFS bir senaryoya gördüm:

anlarım kadarıyla
[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 eşdeğer gibi görünüyor. Bir şey mi eksik? Parantez ve ekstra dolar işareti kullanmak için herhangi bir sebep var mı?

+4

FYI in * this * case '" Alan Yolu = $ ($ areaPath); "' parens gereksizdir. "Alan Yolu = $ areaPath;" 'eşit derecede iyi çalışır. Yani, basit değişken genişleme sadece çift tırnaklı bir dizgede çalışır. $ ($ Variable) gibi bir ifadeyi değerlendirmeniz gerektiğinde parense ihtiyacınız var.özellik) veya $ ($ variable + 1). –

cevap

22

Sözdizimi, içindeki ifadeyi değerlendirmede yardımcı olur.

$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 

Sen http://ss64.com/ps/syntax-operators.html

+0

Çok net bir açıklama için teşekkür ederiz. – KevinD

1

daha arka plan bilgileri ile Amith George's helpful answer tamamlamak için daha az okuyabilir: Ne söyleyebilirim Gönderen

, $($taskTitle)$taskTitle eşdeğer gibi görünüyor.

Nitekim "..." bağlamında, genişletilebilir bir dize içinde:

  • Bir basit değişken referans gibi $taskTitle veya $env:HOME

    ile $(...) gerekmediğini
    • Bazen, değişken adının dizedeki sonraki karakterlerden ayrılmasını sağlamak için ${taskTitle} veya ${env:HOME} - yani tanımlayıcı etrafında {...} formunu kullanmanız gerekir (veya kullanmayı tercih edebilirsiniz).
  • Başka şey için $(...) ihtiyaç DO:

    • bir özellik erişme; Örneğin, bir ifadesinin gömülmesi; ör .:
      "path prefix: $($var + '/')"
    • tüm komutları (hatta birden olanlar) gömülerek; Örneğin.: Kısacası
      "file names: $(Get-ChildItem *.txt | Select-Object -ExpandProperty Name)"

:

  • $(...) içinde "..." basit değişken referanslar dışında herhangi gerekli ve ifadeleri"..." içindeki tüm gömmek için izin verir; Her zamanki gibi, dize değerlendirildiğinde, $(...) bölümü, katıştırılmış deyim (ler) den çıkış ile değiştirilir. Eğer $(...) ve gerekmediğinde düşünmek istemiyorsanız

  • , her zaman onu (örneğin $($taskTitle)) kullanan tercih ama yazmaya hantal ve görsel "gürültülü" olduğuna dikkat edebilirsiniz .

    • Ikaz: $($var) davranışı $var ([System.Collections.IEnumerable] uygulamak) bir koleksiyon yani eğer $var/${var} olduğu gibi değildir aynı olduğu bir kenarı durumda var olduğu Sadece tekil ürününü içerir - aşağıdaki PetSerAl 'in yorumları için aşağıya bakın. Başvurulan değişkenin/gömülü ifadenin değer zaten bir dizedir sürece
  • , bu kültür duyarlı stringification destekleyen türleri dizgelenmiş olan kayda değer bir bükülme ile .NET .ToString() yöntemi kullanılarak dizgelenmiş olduğunu değişmez kültürü ile , gevşek bir şekilde, ABD-İngilizce formatı olan,; örneğin, ,'un ondalık işareti olduğu kültürlerde bileher zaman1.2; Daha fazlası için benim this answer'a bakın.

Belgeleme:

$(...) için resmi adı (tersely) Get-Help about_Operators belgelenen, operatör özel kullanım orada tartışmak değil açıklama sanki, alt ifade operatörü olduğunu genişletilebilir dizelerin içeriği. genişletilebilir dizeleri dahil dize hazır anlatılır Tersine

, Get-Help about_Quoting_Rules, sadece örnekleri genişletilebilir dizeleri bağlamında $(...) kullanım göstermektedir.

+1

BTW, '" $ {variable} "' ve '" $ ($ variable) "' her zaman aynı sonucu döndürmez. – PetSerAl

+1

Örnek: [gist] (https://gist.github.com/PetSerAl/d6336e2bb76388af59e45f5942fb6935) veya [tio.run] (https://tio.run/##[email protected]/[email protected]@Cc/ EghHsjanDtrYsQKJe7OMVFfKm8tdenoXSybjRt6CmZvCSfAZfoLlXxocUvpfbl4arcFSkNwyFe6bqV0NHIhyg/8Ds8wAzy66r92qZ @ 7FE7LBWZwjbp6aQAFm8x8YZwZUeR8BQ) açıklama için de – PetSerAl

+1

.:. Bu $ {a} .GetType() FullName' ve '$ ($' arasındaki farkın doğrudan sonuçları a) .GetType() FullName'; ve koleksiyon türleri nasıl dizilir. – PetSerAl