虽然我能够实现自己的目标,但我不明白为什么而且我担心自己还在做错事。
上下文是使用FTP检索日期时间值以与另一个日期进行比较,以检索文件的时间戳。使用以下字符串接收日期时间:
$FTPrequest = [System.Net.FtpWebRequest]::Create($FTPTargetFile)
$FTPrequest.Method = [System.Net.WebRequestMethods+FTP]::GetDateTimestamp
$FTPrequest.Credentials = $Credentials
$response = $FTPrequest.GetResponse().StatusDescription
$tokens = $response.Split(" ")
if ($tokens[0] -eq 213) {
$Timestampdata = $tokens[1]
} else {
Write-Output "FTP timestamp request for " + $FTPTargetFile + " returned an error"
}
我发现的几乎所有可用资源都清楚地表明ParseExact使用字符串来导出日期时间,如下面的脚本行所示:
$d = [DateTime]::ParseExact($Timestampdata,"yyyyMMddHHmmss",$null)
但无论是在脚本中还是在命令提示符下,上面的行始终返回以下错误:
Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime." At C:\hw-sw\powershell\FTPupload option - getFileInfo.ps1:38 char:1 + $d = [DateTime]::ParseExact($Timestampdata,"yyyyMMddHHmmss",$null) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : FormatException
我找到了2个链接(lin1,link2 - 第二个链接解决了一个略有不同的问题,但仍然提出了一点,建议ParseExact()
使用intXX,如以下脚本行:
$d = [DateTime]::ParseExact([convert]::ToInt64($Timestampdata),"yyyyMMddHHmmss",$null)
是的,上面一行没有错误。
虽然我很感激找到了我的脚本问题的潜在解决方案,但我感到不安,因为我不明白为什么ParseExact正在使用int64,而不是像我预期的那样使用字符串。
PowerShell中是否有一些设置改变了它的工作原理?我相信我必须犯一些简单的错误,但我无法弄清楚。
答案 0 :(得分:1)
static datetime ParseExact(string s, string format, System.IFormatProvider provider)
static datetime ParseExact(string s, string format, System.IFormatProvider provider, System.Globalization.DateTimeStyles style)
static datetime ParseExact(string s, string[] formats, System.IFormatProvider provider, System.Globalization.DateTimeStyles style)
这些是PSv5.1上ParseExact
的重载方法。您将其传递给$null
提供商。
在更多阅读之后,确保您的第一个参数没有空格或者它将失败。还要确保您当前的文化对于您期望的行为是正确的。