2011-06-19 25 views
25

Hãy thử cách này:Làm cách nào để xác thực tham số chức năng PowerShell cho phép chuỗi rỗng?

function f1 
{ 
    param(
    [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)] 
    [string] 
    $Text 
    ) 
    $text 
} 

function f2 
{ 
    param(
    [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)] 
    #[string] 
    $Text 
    ) 
    $text 
} 

function f3 
{ 
    param(
    [Parameter(Mandatory=$False,ValueFromPipelineByPropertyName=$true)] 
    [string] 
    $Text 
    ) 
    $text 
} 

f1 '' 
f2 '' 
f3 '' 

Đây f1 ném lỗi. Bây giờ hãy thử

f2 $null 
f3 $null  

Lần này chỉ f2 phát sinh lỗi. Những gì tôi muốn là một hàm f, sao cho

f '' # is accepted 
f $null # returns an error 
+2

+1 cho câu hỏi hay. –

+0

Xin lỗi, tôi không hiểu, chức năng 'f2' của bạn hoạt động như bạn muốn. f2 '' được chấp nhận và f2 $ null tạo ra lỗi. – JPBlanc

+0

@JPB Tôi nghĩ rằng vấn đề đó là về kiểu dữ liệu. –

Trả lời

45

Các khối thuộc tính bắt buộc các giá trị null và trống rỗng và sẽ nhắc bạn cho một giá trị. Để cho phép giá trị trống (bao gồm cả null) thêm thuộc tính tham số AllowEmptyString:

function f1 
{ 
    param(
    [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)] 
    [AllowEmptyString()] 
    [string]$Text 
    ) 
    $text 
} 
+0

Phiên bản của bạn tốt hơn phiên bản Roman Kuzmin, nó loại bỏ các chuỗi không phải là f1 @ (1, 2). Thực tế là f1 $ null được chấp nhận dường như là vấn đề nhỏ nhất. BTW gần giống với f3. –

+0

Hãy thử thay thế AllowEmptyString bằng ValidateNotNull. nó cho phép các chuỗi rỗng nhưng không cho phép rỗng. –

+0

Không, ValidateNotNull() không thành công cho f1 ''. –

6

Đây là giải pháp phù hợp với các yêu cầu với báo trước.

function f1 
{ 
    param(
    [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)] 
    $Text 
    ) 
    Write-Host 'Working' 
    $text 
} 

f1 '' 
f1 $null 

Output:

Working 
f1 : Cannot bind argument to parameter 'Text' because it is null. 

Caveat

Để phù hợp với những yêu cầu chúng ta phải bỏ qua việc khai báo kiểu tường minh của [string]. Vấn đề là PowerShell có xu hướng chuyển đổi null thành các chuỗi rỗng ở mọi nơi mà loại [string] được chỉ định. Do đó, nếu chúng ta sử dụng khai báo kiểu thì giá trị null thực sự không bao giờ đến hàm.

P.S. Dưới đây là một vấn đề có liên quan nộp: It isn't possible to pass null as null into a .NET method that has a parameter of type String

+0

Tôi vừa nhận ra rằng đây chính là 'hàm f2'. Vì vậy, đó không phải là một câu trả lời thực sự, có lẽ :) –

+1

+1 Đó là những gì tôi đang nói từ đầu; o) Nhưng bạn đưa ra lời giải thích, bạn là người. – JPBlanc

1

Chỉ vì lợi ích của sự hoàn chỉnh, nếu bạn muốn đầu vào của bạn được xác nhận chống lại kiểu chuỗi, bạn có thể làm điều đó sau đó các thông số khai:

function f1 
{ 
    param(
    [Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)] 
    $Text 
    ) 
    if (!($text -eq '') -and !($text -as [string])) {write-host "wrong type"; return } 
    $text 
} 

chức năng này hoạt động như sau:

  • Ném "không thể kết luận .." ngoại lệ khi đầu vào là $null
  • Passes khi đầu vào là một sản phẩm nào chuỗi
  • thoát với thông điệp loại sai khi đầu vào không phải là một chuỗi
Các vấn đề liên quan