底线排队
我正在寻找一种方法来验证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专业人员如何处理这种情况。
任何建议都将不胜感激。
答案 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
)