为什么我的PowerShell脚本中的ParseExact接受int64而不是字符串?

时间:2017-10-25 14:48:44

标签: powershell

虽然我能够实现自己的目标,但我不明白为什么而且我担心自己还在做错事。

上下文是使用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个链接(lin1link2 - 第二个链接解决了一个略有不同的问题,但仍然提出了一点,建议ParseExact()使用intXX,如以下脚本行:

$d = [DateTime]::ParseExact([convert]::ToInt64($Timestampdata),"yyyyMMddHHmmss",$null)

是的,上面一行没有错误。

虽然我很感激找到了我的脚本问题的潜在解决方案,但我感到不安,因为我不明白为什么ParseExact正在使用int64,而不是像我预期的那样使用字符串。

PowerShell中是否有一些设置改变了它的工作原理?我相信我必须犯一些简单的错误,但我无法弄清楚。

1 个答案:

答案 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提供商。

Additional information

Your use case

在更多阅读之后,确保您的第一个参数没有空格或者它将失败。还要确保您当前的文化对于您期望的行为是正确的。