これを試してください:
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
Mandatory属性は、null値と空の値をブロックし、値の入力を求めます。空の値(nullを含む)を許可するには、 AllowEmptyString パラメーター属性を追加します。
function f1
{
param(
[Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]
[AllowEmptyString()]
[string]$Text
)
$text
}
これは、注意事項を満たした要件に適合するソリューションです。
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として渡すことはできません
完全を期すために、入力を文字列型に対して検証したい場合は、後でパラメーター宣言を行うことができます。
function f1
{
param(
[Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true)]
$Text
)
if (!($text -eq '') -and !($text -as [string])) {write-Host "wrong type"; return }
$text
}
この関数は次のように動作します。
$null
の場合、「引数をバインドできません。」という例外をスローします