我正在尝试为最近的条目解析文件。日志文件中的每个条目均以格式“m/d/yyyy h:mm:ss PM”的格式开头。将字符串转换为powershell 2.0中的datetime
我写的完成我想要的东西,但遗憾的是这个脚本在PowerShell的5,但没有运行PowerShell的2
$regex = '\b([1-2][0-9]|[0-9])\/([1-3][0-9]|[0-9])\/(20[0-9][0-9]) ((1[0-2]|0?[1-9]):([0-5][0-9]):([0-5][0-9]) ([AaPp][Mm]))'
$lines = gci C:\temp\Gateway.log | select-string -pattern $regex |select linenumber, matches
[email protected]()
foreach($line in $lines)
{
[datetime]$logdate = ($line.matches).value
$ln = $line.linenumber
if ($logdate -gt '2017-06-29 12:00:00')
{
$log += $ln
}
}
$log
当我尝试使用PowerShell 2在服务器上运行此脚本的脚本,我得到以下错误。
无法将null转换为键入“System.DateTime”。
我无法将select-string找到的值转换为datetime。试图转换成字符串的toString并与出串
$dt = $line.matches
$val = $dt|select Value
$val1 = $val|Out-String
$val2 = $val.tostring()
[datetime]$val1
[datetime]$val2
我怎样才能获得价值日期时间,所以我可以在它的PowerShell 2做datemath上?
不管PowerShell的版本CultureInfo对象,简单地铸造字符串'DateTime'是拙劣的形式,因为它假定现场实际接受的日期/时间值那个特定的格式。改用'[DateTime] :: ParseExact($ val1,“M/d/yyyy H:mm:ss tt”,[CultureInfo] :: InvariantCulture)'。 (我忘记了是否有更多的PowerShell的方式来做到这一点。) –
还要注意,你的正则表达式过于复杂:如果有人试图传递'14/68/3016 1:62:63 PM '作为一个有效的日期/时间,只要让解析器挑出那是无效的。像[[0-9] +'这样的东西对于简单的描绘工作来说很好。如果日期/时间恰好具有固定大小或非空格分隔符,则更简单。 –
@JeroenMostert大写'H'表示24小时格式,更改为小写'h' – LotPings