2012-11-28 26 views
15

Tôi đã xem một số tập lệnh mẫu trực tuyến sử dụng tính năng này. Gần đây nhất, tôi thấy nó trong một kịch bản trên 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])" 

Từ những gì tôi có thể nói, $($taskTitle) có vẻ là tương đương với $taskTitle. Tui bỏ lỡ điều gì vậy? Có lý do gì để sử dụng dấu ngoặc đơn và ký hiệu đô la thêm không?

+4

FYI trong trường hợp * này * "Đường dẫn Area = $ ($ areaPath);" 'các dấu ngoặc đơn là không cần thiết. '" Area Path = $ areaPath; "' sẽ hoạt động tốt như nhau. Tức là, việc mở rộng biến đơn giản chỉ hoạt động trong một chuỗi được trích dẫn kép. Bạn cần các parens khi bạn cần đánh giá một biểu thức như $ ($ variable.thuộc tính) hoặc $ ($ variable + 1). –

Trả lời

22

Cú pháp giúp đánh giá biểu thức bên trong nó.

$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 

Bạn có thể đọc thêm tại http://ss64.com/ps/syntax-operators.html

+0

Cảm ơn bạn đã giải thích rất rõ ràng. – KevinD

1

Để bổ sung Amith George's helpful answer với nhiều thông tin nền:

Từ những gì tôi có thể nói, $($taskTitle) có vẻ là tương đương với $taskTitle.

Thật vậy, trong bối cảnh "...", một chuỗi mở rộng:

  • Bạn không cần $(...) với một tham chiếu biến đơn giản như $taskTitle hoặc $env:HOME

    • Đôi khi bạn phải (hoặc có thể chọn) sử dụng biểu mẫu ${taskTitle} hoặc ${env:HOME} - nghĩa là, {...} xung quanh số nhận dạng - để làm biến dạng tên biến từ các ký tự tiếp theo trong chuỗi.
  • Bạn DO cần $(...) cho bất cứ điều gì khác:

    • truy cập vào một tài sản; ví dụ:
      "count is: $($var.Count)"
    • nhúng biểu thức; ví dụ .:
      "path prefix: $($var + '/')"
    • nhúng toàn bộ lệnh (thậm chí có thể nhiều người); ví dụ.:
      "file names: $(Get-ChildItem *.txt | Select-Object -ExpandProperty Name)"

Nói tóm lại:

  • $(...) bên trong "..." là cần thiết cho bất cứ điều gì khác hơn là tài liệu tham khảo biến đơn giản và cho phép bạn nhúng toàn bộ báo cáo bên "..."; như thường lệ, khi chuỗi được đánh giá, phần $(...) được thay thế bằng đầu ra (được hợp nhất) từ (các) tuyên bố được nhúng.

  • Nếu bạn không muốn nghĩ về khi $(...) được và không cần thiết, bạn có thể chọn để luôn sử dụng nó (ví dụ, $($taskTitle)), nhưng lưu ý rằng nó là cồng kềnh để gõ và trực quan "ồn ào" .

    • Caveat: Có một cạnh trường hợp nơi hành vi của $($var)không giống như của $var/${var}, cụ thể là nếu $var là một bộ sưu tập (thực hiện [System.Collections.IEnumerable]) mà xảy ra chỉ chứa một mục đơn - xem các nhận xét của PetSerAl bên dưới.
  • Trừ giá trị/tuyên bố nhúng của biến tham chiếu của đã là một chuỗi, nó là chuyển đổi thành chuỗi sử dụng .NET .ToString() phương pháp, với xoắn đáng chú ý là các loại có hỗ trợ văn hóa nhạy cảm stringification được chuyển đổi thành chuỗi với văn bản bất biến , được nói một cách lỏng lẻo, giống như định dạng Mỹ-Anh; ví dụ: "$(1.2)"luôn là sản lượng 1.2, ngay cả trong các nền văn hóa nơi , là dấu thập phân; xem this answer của tôi để biết thêm.

Documentation:

Tên chính thức cho $(...) là các nhà điều hành subexpression, như (ngắn gọn) ghi nhận ở Get-Help about_Operators, mặc dù lời giải thích có không thảo luận sử dụng cụ thể của nhà điều hành trong ngữ cảnh của chuỗi có thể mở rộng.

Ngược lại, Get-Help about_Quoting_Rules, thảo luận về chuỗi ký tự bao gồm chuỗi có thể mở rộng, chỉ hiển thị ví dụ trong số $(...) sử dụng trong ngữ cảnh chuỗi có thể mở rộng.

+1

BTW, '" $ {variable} "' và '" $ ($ variable) "' không phải lúc nào cũng trả lại kết quả tương tự. – PetSerAl

+1

Dưới đây là ví dụ: [gist] (https://gist.github.com/PetSerAl/d6336e2bb76388af59e45f5942fb6935) hoặc [tio.run] (https://tio.run/##[email protected]/[email protected]@Cc/ EghHsjanDtrYsQKJe7OMVFfKm8tdenoXSybjRt6CmZvCSfAZfoLlXxocUvpfbl4arcFSkNwyFe6bqV0NHIhyg/8Ds8wAzy66r92qZ @ 7FE7LBWZwjbp6aQAFm8x8YZwZUeR8BQ) – PetSerAl

+1

đối với lời giải thích:.. nó là hậu quả trực tiếp của sự khác biệt giữa '$ {a}() FullName' và .GetType' $ ($ a) .GetType() FullName'; và cách các loại bộ sưu tập được xâu chuỗi. – PetSerAl