处理Param块内的错误

时间:2016-10-06 06:53:10

标签: powershell

我有一种情况需要为param块中的错误定义自定义错误处理程序。例如,如果param块中存在一些错误,我需要函数返回退出值1,并打印出自定义的错误消息。

以下是我的代码:

function test {
  Param(
    [string]$Name,
    [int]$age
  )

  Begin {
    $ErrorVar = 0
    if (! $Name) {
      Write-Host "Name is a mandatory parameter...please provide a value"
      $ErrorVar = 1
    }
    if (! $age) {
      Write-Host "Age is a mandatory parameter...please provide a value"
      $ErrorVar = 1
    }
  }
  Process {
    if ($ErrorVar -eq 0) {
      Write-Host "My name is $name and my age is $age"
    }
  }
  End {
    if ($ErrorVar -eq 1) {
      return 1
    } else {
      return 0
    }
  }
}

如果我不使用任何一个参数(NameAge),错误处理程序将正常运行:

PS> $var = test 
Name is a mandatory parameter...please provide a value
Age is a mandatory parameter...please provide a value

PS> $var = test -Name Subhayan
Age is a mandatory parameter...please provide a value

但是当我省略参数的值时,我遇到了系统定义的错误消息并且没有调用我的错误处理程序:

PS> $var = test -Name -age 32
test : Missing an argument for parameter 'Name'. Specify a parameter of type
'System.String' and try again.
At line:1 char:13
+ $var = test -Name -age 32
+             ~~~~~
    + CategoryInfo          : InvalidArgument: (:) [test], ParameterBindingException
    + FullyQualifiedErrorId : MissingArgument,test

如果param块中出现任何错误,我怎样才能确保调用自定义的错误消息,即使在我使用参数名但未能提供值的情况下也是如此。

1 个答案:

答案 0 :(得分:1)

您应该阅读PowerShell中的高级功能。 这可以在这里完成:https://technet.microsoft.com/en-us/library/hh847743.aspx

至于您的功能,您只需在Mandatory - 块中使用Parameter关键字即可。 像这样:

function Test 
{
  Param(
    [Parameter(Mandatory)]
    [String]$Name,
    [Parameter(Mandatory)]
    [Int]$Age
    )
  Process
  {
    Write-Host "My name is $name and my age is $age"
  }
}

该文档还说明了您是否需要特定范围(ValidateRange)或特定集(ValidateSet)。