我想强迫用户使用特定的日期字符串以在我的功能中使用。是否有一种手段可以与PowerShell中的ValidatePattern一起执行此操作。我已经尝试过,它似乎不起作用:
function Test-Date {
Param(
[ValidatePattern('MM-DD-YYYY-HH-mm-ss')]
[DateTime]$date
)
Write-Output $date
}
好吧,我想我找到了自己问题的答案。我想验证我以特定方式从用户那里得到了约会,因此我可以告诉他们如何按照我的期望输入日期。我想要一般短期和短时间的日期格式,因此我将" G"用作我的模式。我在这里找到的其他模式
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
}
用于为参数值执行特定格式,我不建议在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
能够返回一个布尔值,以指示字符串是否为有效日期,因此我可能首先不会在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$'
}
或这样的话,如果您想成为文化 - 敏捷:
function Test-Date {
[CmdletBinding()]
Param(
[Parameter(Mandatory=$true)]
[string]$Date
)
$culture = Get-Culture
try {
[void][DateTime]::ParseExact($Date, 'g', $culture)
$true
} catch {
$false
}
}