web-dev-qa-db-ja.com

空の文字列を許可する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なので、

f '' # is accepted
f $null # returns an error
34
bernd_k

Mandatory属性は、null値と空の値をブロックし、値の入力を求めます。空の値(nullを含む)を許可するには、 AllowEmptyString パラメーター属性を追加します。

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

これは、注意事項を満たした要件に適合するソリューションです。

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

f1 ''
f1 $null

出力:

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

警告

要件を満たすには、[string]の明示的な型宣言を省略する必要があります。問題は、PowerShellが[string]型が指定されているすべての場所でnullを空の文字列に変換する傾向があることです。したがって、型宣言を使用する場合、null値が実際に関数に到達することはありません。

追伸提出された関連する問題は次のとおりです。 String型のパラメーターを持つ.NETメソッドにnullをnullとして渡すことはできません

6
Roman Kuzmin

完全を期すために、入力を文字列型に対して検証したい場合は、後でパラメーター宣言を行うことができます。

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

この関数は次のように動作します。

  • 入力が$nullの場合、「引数をバインドできません。」という例外をスローします
  • 入力が空の文字列の場合に渡されます
  • 入力が文字列でない場合、メッセージ間違ったタイプで終了します
1
Emiliano Poggi