根据' MM-DD-YYYY-HH-mm-ss'验证日期

时间:2017-09-12 18:45:02

标签: powershell

我想强制用户使用特定日期字符串在我的函数中使用。是否有办法在Powershell中使用ValidatePattern执行此操作。我试过这个并且它似乎无法工作:

function Test-Date {
  Param(
    [ValidatePattern('MM-DD-YYYY-HH-mm-ss')]
    [DateTime]$date
  )
  Write-Output $date
}

2 个答案:

答案 0 :(得分:0)

好的,我想我找到了自己问题的答案。我想验证我是否以特定的方式从用户那里得到了一个日期,所以我可以告诉他们如何按照我的预期输入日期。我希望日期格式一般是短日期和短时间,所以我使用了' g'作为我的模式。我找到的其他模式here

   function Test-Date
  {param(
    [ValidateScript(
    {
        try{[datetime]::ParseExact($psitem ,'g' ,[System.Globalization.CultureInfo](Get-Culture))}catch{throw "Datetime is in the wrong format ($_) Use this format 8/30/2007 11:20 AM"}
    })]
    [string]$date


  )
   Write-Output $date
  }

答案 1 :(得分:0)

为了强制执行参数值的特定格式,我不建议解析ValidateScript()块中的值并在不匹配时抛出异常。通过ValidatePattern()验证字符串,并仅解析函数体中的有效参数。

function Test-Date {
    Param(
        [ValidatePattern('^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2} [AP]M$')]
        [string]$date
    )

    $culture = [Globalization.CultureInfo]::InvariantCulture
    [DateTime]::ParseExact($date, 'g', $culture)
}

话虽如此,我希望函数Test-Date返回一个布尔值,表明该字符串是否是有效日期,所以我可能不会在{{}}中进行验证{1}}首先阻止。我更喜欢这样的事情:

Param()

或者像这样,如果你想与文化无关:

function Test-Date {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$true)]
        [string]$Date
    )

    $Date -match '^\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2} [AP]M$'
}