2015-04-19 23 views
6

Với chức năng cơ bản này:tham số rỗng là không Null trong chức năng

Function TestFunction { 
    Param ([int]$Par1, [string]$Par2, [string]$Par3) 
    If ($Par1 -ne $Null) { Write-Output "Par1 = $Par1" } 
    If ($Par2 -ne $Null -or $Par2 -ne '') { Write-Output "Par2 = $Par2" } 
    If ($Par3 -ne $Null) { Write-Output "Par3 = $Par3" } 
} 
TestFunction -Par1 1 -Par3 'par3' 

... đầu ra là:

Par1 = 1 
Par2 = 
Par3 = par3 

Mặc dù tôi đã không vượt qua bất cứ điều gì vào biến $Par2, nó vẫn không phải là Null hoặc trống rỗng. Điều gì đã xảy ra, và làm thế nào tôi có thể viết lại câu lệnh sao cho câu lệnh If thứ hai đánh giá là False và khối script không được thực thi?

(tôi thêm -or $Par2 -ne '' chỉ để kiểm tra, nó cư xử như nhau có và không có nó.)

Trả lời

10

Bạn có một lỗi logic trong chương trình của bạn: $Par2 sẽ luôn được không bằng $nullhay không bằng ''.

Để khắc phục logic, bạn nên sử dụng -and thay vì -or đây:

If ($Par2 -ne $Null -and $Par2 -ne '') { Write-Output "Par2 = $Par2" } 

Tuy nhiên, bởi vì bạn đúc lập luận $Par2 thành một chuỗi trong danh sách đối số của hàm:

Param ([int]$Par1, [string]$Par2, [string]$Par3) 
        ^^^^^^^^ 

sự kiểm tra cho $Par2 -ne $Null là không cần thiết vì $Par2 sẽ luôn luôn có loại chuỗi (nếu bạn không cung cấp cho nó một giá trị, nó sẽ được gán cho ''). Vì vậy, bạn thực sự nên viết:

If ($Par2 -ne '') { Write-Output "Par2 = $Par2" } 

Hoặc, vì '' là false, bạn có thể chỉ cần làm:

If ($Par2) { Write-Output "Par2 = $Par2" } 
+0

Đó là nhanh. Nhưng những gì thực sự là IN '$ Par2'? Nếu tôi chuyển một giá trị vào nó, '$ Par2 -ne $ Null' sẽ là đúng. Nhưng nếu tôi không đưa vào nó '$ Par2 -ne $ Null' phải là sai và không nên được thực hiện, phải không? Chưa hết, ... – Mark

+0

Xem chỉnh sửa của tôi. '$ Par2' sẽ luôn là một chuỗi bởi vì bạn đã gán nó vào một trong danh sách đối số của hàm. Ngoài ra, trong tương lai, bạn có thể lấy kiểu biến bất kỳ bằng cách sử dụng phương thức 'GetType':' $ Par2.GetType() '. Điều này sẽ hỗ trợ rất nhiều trong việc gỡ lỗi. – iCodez

+0

Vì vậy, bởi vì tôi đúc nó trong khối tham số, nó sẽ luôn luôn tồn tại và không bao giờ được null? Ngay cả khi tôi đã thay đổi giá trị mặc định thành null ('[string] $ Par2 = $ Null')? Và một số nguyên sẽ luôn là 0? Vì vậy, nếu tôi không chuyển gì vào '$ par1', thì' If ($ Par1) 'sẽ là true vì nó chứa 0? Vì vậy, khi cố gắng viết kịch bản tốt hơn bằng cách truyền các loại biến, tôi thực sự đã làm cho bản thân khó khăn hơn. – Mark

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