将validatescript中的错误捕获到自定义错误消息中

时间:2017-07-25 09:10:39

标签: regex powershell

在我的脚本中,我有一个日期参数需要采用某种格式,我已经使用validatescript和regex解决了这个问题。这很好用但我想要一个自定义错误。您的日期不会验证为DateTime b。您的日期未验证正则表达式

Param (
[parameter(mandatory=$false)]
[ValidateScript({
      If ($_ -match "^([0-9]{4}[-]?((0[13-9]|1[012])[-]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-]?31|02[-]?(0[1-9]|1[0-9]|2[0-8]))|([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00)[-]?02[-]?29)") {
        $True
      }
      else {
        Write-host "The Date is invalid and need to be in this format, 2017-07-25" -ForeGroundColor Yellow
      }
    })]
    [datetime]$date
           )

正在考虑使用try和catch

[ValidateScript({
      try {
$_ -notmatch "^([0-9]{4}[-]?((0[13-9]|1[012])[-]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-]?31|02[-]?(0[1-9]|1[0-9]|2[0-8]))|([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00)[-]?02[-]?29)"
        } catch [System.Management.Automation.ParameterBindingValidationException] {
    Write-host "The Date is invalid and need to be in this format, 2017-07-25" -ForeGroundColor Yellow
        }
)]

有什么建议吗?

编辑:

将其更改为:

        Param (
            [parameter(mandatory=$false)][alias('d')][string]$date #date in format yyyy-mm-dd
            )

if ($date){
try {get-date($date)}
catch{
 Write-host "The Date is invalid and need to be in this format, yyyy-mm-dd" -ForeGroundColor Yellow
 $date = getdate(read-host)
}
}

有效,但如果不遵守所请求的格式并继续输入并再次输入070725,则会出现错误。有没有办法循环它,直到你得到一个正确的格式?也许是Do Until循环?

2 个答案:

答案 0 :(得分:1)

我认为你可能会以错误的方式解决这个问题?

为什么不让用户输入他想要的内容?检查输入的内容是否验证为System.DateTime。 然后使用$ date.ToString(“yyyy-MM-dd”)按照想要的方式对其进行整形,并对其进行正则表达式检查(如果必须)。

更好的是,我认为将使用DateTime对象上的属性进行验证,而不是重新编写字符串。

(很抱歉发布此答案,更多的是评论,但我不能这样做)

答案 1 :(得分:0)

TL; DR - 选择匹配正则表达式的datetime string,而不是两者。

我不理解要求datetime并且以特定格式拥有此datetime的要求。

您有一个datetime对象,在显示为字符串时使用与文化相关的设置。或者ToString()被明确用于获取您想要的格式(例如.ToString("yyyy-MM-dd"))。

或者你有一个String对象,它有一个特定的字符串形式。但不能将其视为日期,因此可以使用.ToDateTime()或其他方法将其转换为日期时间对象。

此处理也导致ValidateScript中出现问题。

  • $date是有效的datetime

    • 在调用datetime之前,它已成功转换为ValidateScript。在你可以运行rrgex之前,需要使用ToString())。
  • 或$ date是无效的datetime

    • 在这种情况下,它未成功转换为datetime,并抛出PowerShell错误。在ValidateScipt可以运行并执行自定义错误之前。

<强>字符串

Param (
    [parameter(mandatory=$false)]
    [ValidateScript({
            try{
                $culture = [cultureinfo]::InvariantCulture
                [datetime]::ParseExact($_,"yyyy-MM-dd",$culture)
            }catch{
                throw "The Date is invalid and need to be in this format, 2017-07-25"
            }       
        })
    ]
    [string]$date 
)

Write-Host $date
Write-Host $date.GetType()

# if you actually want a datetime object
$date = [datetime]::ParseExact($date,"yyyy-MM-dd",$culture)

<强>日期时间

[CmdletBinding()]
Param (
    [parameter(mandatory=$false)]
    [datetime]$date 
)