我正在编写一个脚本来根据用户输入得到结果,这里用户可以给出日期或日期时间...我需要根据输入(日期或日期时间)得到结果。
我试过如下:
$StartDate = Read-Host -Prompt 'Enter the start date of the logs, Ex: 17/07/2017 or 17/07/2017 09:00:00'
$culture = [Globalization.CultureInfo]::InvariantCulture
$pattern = 'dd\/MM\/yyyy HH:mm:ss', 'dd\/MM\/yyyy'
$params['After'] = [DateTime]::ParseExact($StartDate, $pattern, $culture)
得到以下错误:
Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime."
+ $params['After'] = [DateTime]::ParseExact <<<< ($StartDate, $pattern, $culture)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
请建议,我在这里遗漏了什么。
答案 0 :(得分:3)
我很幸运在日期使用PowerShell的默认Get-Date功能。我会尝试使用以下内容:
$StartDate = Get-Date (Read-Host -Prompt 'Enter the start date of the logs, Ex: 17/07/2017 or 17/07/2017 09:00:00')
答案 1 :(得分:1)
如果您仍想使用ParseExact()
,那么您的问题是$pattern
是一个字符串数组而不是字符串。您可以检查要使用的模式,然后只传递该模式。
$StartDate = Read-Host -Prompt 'Enter the start date of the logs, Ex: 17/07/2017 or 17/07/2017 09:00:00'
$culture = [Globalization.CultureInfo]::InvariantCulture
if ($startdate -match '^\w\w\/\w\w\/\w\w\w\w$') {
$pattern = 'dd\/MM\/yyyy'
} else {
$pattern = 'dd\/MM\/yyyy HH:mm:ss'
}
$params['After'] = [DateTime]::ParseExact($StartDate, $pattern, $culture)
答案 2 :(得分:0)
我可能只是使用一个短函数;类似的东西:
function Read-Date {
param(
[String] $prompt
)
$result = $null
do {
$s = Read-Host $prompt
if ( $s ) {
try {
$result = Get-Date $s
break
}
catch [Management.Automation.PSInvalidCastException] {
Write-Host "Date not valid"
}
}
else {
break
}
}
while ( $true )
$result
}
然后你可以这样写:
Read-Date "Enter a date"
代码将提示,直到用户输入有效的类似日期的字符串。用户输入有效的日期字符串后,函数的输出就是[DateTime]
个对象。