2017-09-08 94 views
1

在PowerShell中,我试图将我从文本文件中选择的字符串转换为日期,以便我可以添加或减去日期,小时等等。问题是,当我尝试将导致字符串从文本文件转换,我收到以下错误:字符串日期错误

Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime." 

At line:15 char:5 

+  [datetime]::ParseExact($SC4,'HH:mm:ss', $null) 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : FormatException 

验证码:

Get-Content results2.txt | ForEach-Object{ 
$splitUp = $_ -split " " 
$SC=$splitUp[0] -split " " 
$SC2=$splitUp[1] -split " " 
$SC3=$SC + $SC2 
Write-Host -NoNewline $SC3 | Write-Output $SC4 
Write-Host $SC4 
$r=[datetime]::ParseExact($SC4,'dd/MM/yyyy HH:mm:ss', $null) 
echo $r 

}

文件result2.txt我从中读到,包含以下内容:

09/07/2017 16:35:56 - 2017-09-07 14:55:51,312 [342] 
09/07/2017 16:35:56 - 2017-09-07 14:55:51,312 [342] 
09/07/2017 16:35:56 - 2017-09-07 14:56:54,918 [305] 
09/07/2017 16:35:56 - 2017-09-07 14:58:36,133 [113] 

回答

1

问题是因为$SC4是一个空变量。您尝试通过Write-Host输出管道填充它不起作用(因为Write-Host写入控制台而不是管道)。

整个过程使事情复杂化并且可以被删除。这在我的测试中正常工作:

Get-Content result2.txt | ForEach-Object { 
    $splitUp = $_ -split " " 
    $SC=$splitUp[0] -split " " 
    $SC2=$splitUp[1] -split " " 
    $SC3 = $SC + $SC2 
    $r=[datetime]::ParseExact($SC3,'dd/MM/yyyy HH:mm:ss', $null) 
    echo $r 
} 

下面是一个使用正则表达式的文件中匹配的第一个日期更短的解决方案:

Get-Content result2.txt | ForEach-Object { 
    $Check = $_ -Match '^\d{2}/\d{2}/\d{4} \d{2}:\d{2}:\d{2}(?= .*$)' 
    If ($Check) { $R=[datetime]::ParseExact($Matches[0],'dd/MM/yyyy HH:mm:ss', $null) } 
    Echo $R 
} 
+0

谢谢!现在它可以工作。我这样做是因为如果我显示$ SC3,它会在下一行显示日期和时间,所以我认为它会影响ParseExact所需的格式。再次感谢! –

0

其他方法:

Get-Content "c:\temp\test.txt" | ForEach-Object { 
    [datetime]::ParseExact(($_ -split " - ")[0],'dd/MM/yyyy HH:mm:ss', $null) 
} 


#short version 
gc "c:\temp\test.txt" |%{[datetime]::ParseExact(($_ -split " - ")[0],'dd/MM/yyyy HH:mm:ss', $null)}