如何省略cmdlet参数

问题描述 投票:0回答:1

我有关于 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 独立确定向参数传递了一个空变量,从而在没有参数的情况下执行?

powershell
1个回答
0
投票

两种通用方法:

  • 允许调用者传递
    $null
    ,在函数内部处理它,或者
  • 在调用站点使用splatting

要允许调用者将

$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
© www.soinside.com 2019 - 2024. All rights reserved.