在PowerShell中抛出Param异常的替代方法?

时间:2012-06-13 19:41:02

标签: powershell exception-handling parameters validation

底线排队

我正在寻找一种方法来验证powershell(v1)命令行参数,而不会将异常传播回命令行。

详情

我有一个powershell脚本,目前使用param[ValidateNotNullOrEmpty]一起验证命令行参数:

param(
   [string]
   [ValidateNotNullOrEmpty()]$domain = $(throw "Domain (-d) param required.")
)

我们正在改变错误处理的范例,我们不再希望将异常传递回命令行,而是提供自定义错误消息。由于param块无法包含在try catch块中,因此我使用之类的以下内容:

param(
   [string]$domain = $("")
)
Try{
   if($domain -like $("")){
      throw "Domain (-d) param required."
    }
...

}Catch{
#output error message 
}

我担心的是,我们绕过了使用param时可用的所有内置验证。我的新技术是合理的解决方案吗?在封装脚本中的异常时,是否有更好的方法来验证命令行参数?我非常有兴趣了解PowerShell专业人员如何处理这种情况。

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:1)

一种方法是使用default parameters这样[来自msdn] -

Function CheckIfKeyExists 
{ 
    Param( 
        [Parameter(Mandatory=$false,ValueFromPipeline=$true)] 
        [String] 
        $Key = 'HKLM:\Software\DoesNotExist' 
    ) 
    Process 
    { 
        Try 
        { 
            Get-ItemProperty -Path $Key -EA 'Stop' 
        } 
        Catch 
        { 
            write-warning "Error accessing $Key $($_.Exception.Message)"   
        } 
    } 
}

因此,在这里,如果您尝试在不传递任何参数的情况下调用函数,您将收到警告您在try / catch块中定义的内容。并且,您没有使用任何默认验证属性。您应该始终假设您将遇到错误,并编写可以在错误中幸存的代码。但这里的教训是if you implement a default value, remember that it is not being validated.

了解更多here

答案 1 :(得分:1)

正如我在评论中提到的:我更多地阅读了您的描述,我得出结论,您不应该担心“绕过所有内置验证”。为什么?因为那是完全你的目标。你想绕过它的默认行为,所以如果这是你需要和必须做的 - 而不仅仅是这样做。 ;)

答案 2 :(得分:1)

您可以编写自定义验证脚本。试试这个参数。

Param(
    [ValidateScript({
        If ($_ -eq $Null -or $_ -eq "") {
            Throw "Domain (-d) param required."
        }
        Else {
            $True
        }
    })][string]$Domain
)