在我的脚本中,我有一个日期参数需要采用某种格式,我已经使用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循环?
答案 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
)