2011-06-19 3 views
25

これを試してください:空の文字列を許可するPowerShell関数のパラメータを検証する方法は?

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 '' 

ここでf1はエラーをスローします。今すぐ試してください

f2 $null 
f3 $null  

今回はf2のみがエラーをスローします。

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

+1。 –

+0

申し訳ありませんが、あなたの関数 'f2'はあなたが望むように動作することを理解していません。 f2 ''は受け入れられ、f2 $ nullはエラーを生成します。 – JPBlanc

+0

@ JPBデータ型に関する問題があると思います。 –

答えて

45

必須属性ブロックヌルと空の値の文字列ではなく、値の入力が求められます。 は(ヌルを含む)空の値がAllowEmptyStringパラメータ属性を追加できるようにするには:良い質問の

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

あなたのバージョンはRoman Kuzminよりも優れており、f1 @(1,2)のような非文字列は拒否されます。 f1 $ nullが受け入れられるという事実は、ちょっとした問題であるようです。これはf3とほぼ同じです。 –

+0

AllowEmptyStringをValidateNotNullに置き換えてみます。空の文字列は使用できますが、NULLは使用できません。 –

+0

いいえ、ValidateNotNull()はf1 ''に対して失敗します。 –

6

はここで注意点が要件に合ったソリューションであるように、私が欲しいのは、関数fです。

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

f1 '' 
f1 $null 

出力:我々は[string]の明示的な型宣言を省略しなければならない要件に合うようにするために

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

警告

。問題は、PowerShellが[string]型が指定されているどこでも空の文字列にNULLを変換する傾向があることです。したがって、型宣言を使用すると、実際にはnull値は決して関数に渡されません。

P.S.ここでは、関連する問題が提出されています。この関数のように振る舞う

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

It isn't possible to pass null as null into a .NET method that has a parameter of type String

+0

これはちょうど 'function f2'であることに気付きました。だから、それは本当に本当の答えではないでしょう:) –

+1

+1私は最初から何を言っているのですか?)しかし、あなたは説明をします。あなたはその人です。 – JPBlanc

1

をちょうど完全を期すために、あなたの入力は文字列型に対して検証されたい場合は、その後のパラメータの宣言を行うことができます次の:

  • 例外「引数をバインドすることはできません..」例外入力が空の場合、入力は$null
  • 通過するとき、メッセージ間違った型を持つ文字列
  • 終了し、入力が
関連する問題