【问题标题】:Handling errors from within Param block从 Param 块中处理错误
【发布时间】:2017-02-14 19:25:53
【问题描述】:

我有一种情况,我需要为 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 = 测试
名称是必填参数...请提供一个值
年龄是一个强制性参数...请提供一个值

PS> $var = 测试 -Name Subhayan
年龄是必填参数...请提供一个值

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

PS> $var = test -Name -age 32
测试:缺少参数“名称”的参数。指定类型的参数
'System.String' 然后再试一次。
在行:1 字符:13
+ $var = 测试 -Name -age 32
+ ~~~~~
    + CategoryInfo : InvalidArgument: (:) [test], ParameterBindingException
    + FullyQualifiedErrorId : MissingArgument,test

如何确保每次参数块中出现任何错误时都会调用我的自定义错误消息,即使在我使用参数名称但未能提供值的情况下也是如此。

【问题讨论】:

    标签: powershell


    【解决方案1】:

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

    至于你的函数,你可以简单地在Parameter-block 中使用Mandatory 关键字。 像这样:

    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)。

    【讨论】:

    • 谢谢乔纳斯。但是我需要从自定义定义的 Param 块内部进行错误,因为我需要将错误重定向到日志文件。我不明白强制关键字对我的情况有何帮助。
    • 您发布的代码仅在参数不为空时进行测试。该检查可以通过使用Mandatory-关键字来完成。如果你想检查并抛出一个真正自定义的消息,你应该使用ValidateScript。在此验证中,您输入一个脚本块。
    猜你喜欢
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 2019-11-12
    • 1970-01-01
    相关资源
    最近更新 更多