2008-09-29 34 views
17

Tôi thấy một số hành vi khá lạ với PowerShell, có vẻ như các hàm tùy chỉnh có thể cần một "trình bao bọc dấu ngoặc đơn" để đánh giá như bạn có thể mong đợi. Với một hàm PowerShell đơn giản:Hành vi trả về của hàm PowerShell

function Return-True { return $true } 

và sau đó một số mẫu mã để gọi nó:

PS C:\> Return-True 
True 
PS C:\> Return-True -eq $false 
True 
PS C:\> (Return-True) -eq $false 
False 

Ý tưởng? Bình luận?

Trả lời

34

Khi PowerShell thấy mã thông báo Return-True, mã nhận dạng nó là lệnh và cho đến khi đánh giá hoặc kết thúc câu lệnh, mọi thứ khác là đối số được chuyển đến hàm Return-True.

Bạn có thể thấy điều này trong hành động nếu bạn làm:

PS > function Return-True { "The arguments are: $args"; return $true } 
PS > Return-True -eq $false 
The arguments are: -eq False 
True 

Đó là lý do tại sao tất cả các sự trở lại sau 'True', bởi vì tất cả các bạn đang nhìn thấy là kết quả của gọi Return-True với lập luận khác nhau:

PS > Return-True -eq $false 
True 
PS > Return-True -ne $false 
True 
PS > Return-True -eq $true 
True 
PS > Return-True -ne $true 
True 

Sử dụng (Return-True) buộc PowerShell đánh giá hàm (không có đối số).

5

Dòng thứ hai không thực hiện đánh giá boolean. Nhìn vào những gì xảy ra nếu bạn làm điều tương tự với các chuỗi.

PS C:\> function Return-True { return "True string" } 
PS C:\> Return-True 
True string 
PS C:\> Return-True -eq "False string" 
True string 
PS C:\> (Return-True) -eq "False string" 
False 

Dòng thứ hai chỉ đơn giản trả lại giá trị của hàm và không so sánh. Tôi không chắc chắn chính xác lý do tại sao hành vi này đang xảy ra, nhưng nó làm cho hành vi dễ nhìn hơn khi sử dụng các giá trị boolean đang được chuyển đổi thành chuỗi "True" và "False".

4

Nếu bạn sử dụng trình soạn PowerShell V2, bạn sẽ thấy rằng -eq trong ví dụ đầu tiên là màu xanh, bởi vì nó là một cuộc tranh cãi và -eq trong ví dụ thứ hai là màu xám bởi vì nó là một nhà điều hành

Cũng trong phiên bản V2, bạn có thể nghiêm ngặt về các đối số, với CmdletBinding và param

function Return-True 
{ 
    [CmdletBinding()] 
    param() 
    return $true 
} 
Return-True -eq $false 

Return-True -eq $false 
Return-True : A parameter cannot be found that matches parameter name 'eq'. 
At line:7 char:16 
+ Return-True -eq <<<< $false 
    + CategoryInfo   : InvalidArgument: (:) [Return-True], ParameterBindingException 
    + FullyQualifiedErrorId : NamedParameterNotFound,Return-True 
+0

Tôi không biết về CmdletBinding, cảm ơn – neontapir

Các vấn đề liên quan