我有关于 cmdlet 参数的问题。 假设我有这样的功能
function Do-Something
{
param (
[Parameter(Mandatory=$false)] $fParam
)
get-result -clParam $fParam
}
然后我这样调用这个函数
$var = "somedata"
Do-Something -fParam $var
代码执行时没有错误(当然,如果 $var 具有适当的数据类型) 当我像这样调用函数时
$var = $null #or Variable var does not defined at all
Do-Something -fParam $var
我收到错误,有关“-clParam 的数据类型不正确”或“-clParam 不能为空”等信息。
据我了解,为了避免此类错误,我的函数应该测试 -fParam 是否为空:
function Do-Something
{
param (
[Parameter(Mandatory=$false)] $fParam
)
if($fParam -ne $Null)
{
get-result -clParam $fParam #if fParam is defined, run cmdlet with param
}
else
{
get-result #if fParam isn't define or $Null, run cmdlet without param
}
}
我的问题是:是否可以避免如此庞大的结构?有没有办法强制 cmdlet 独立确定向参数传递了一个空变量,从而在没有参数的情况下执行?
两种通用方法:
$null
,在函数内部处理它,或者要允许调用者将
$null
作为参数传递,请使用 [AllowNull()]
属性装饰器:
function Do-Something
{
param (
[Parameter(Mandatory=$false)]
[AllowNull()]
$fParam
)
if ($null -ne $fParam) {
Get-Result -clParam $fParam
}
else {
Get-Result
}
}
另一种方法是在调用点使用 splatting - splatting 允许我们有条件地准备要传递给字典中的函数的参数,如下所示:
$fArg = $null
$argTable = @{}
if ($null -ne $fArg) {
$argTable['fParam'] = $fArg
}
# if `$fArg` was $null, then `$argTable` will be empty and no parameter arguments will be passed
Do-Something @argTable