0

底线在前面

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

细节

我有一个当前用于验证命令行参数param的powershell 脚本:[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 
}

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

任何意见,将不胜感激。

4

3 回答 3

2

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

Param(
    [ValidateScript({
        If ($_ -eq $Null -or $_ -eq "") {
            Throw "Domain (-d) param required."
        }
        Else {
            $True
        }
    })][string]$Domain
)
于 2014-04-25T13:33:24.443 回答
1

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

于 2012-06-25T21:51:09.227 回答
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.

在这里阅读更多

于 2012-06-13T20:41:58.747 回答