在powershell 2.0中将字符串转换为datetime

时间:2017-07-04 14:56:43

标签: powershell powershell-v2.0

我正在尝试仅为最近的条目解析文件。日志文件中的每个条目都以日期格式为" m / d / yyyy h:mm:ss PM"。

我编写了一个完成我想要的脚本但不幸的是这个脚本在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
$log=@()
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转换为字符串,并使用out-string

  $dt = $line.matches
    $val = $dt|select Value
    $val1 = $val|Out-String
    $val2 = $val.tostring()
    [datetime]$val1
    [datetime]$val2

如何将值作为日期时间获取,以便我可以在其中使用powershell 2进行日期处理?

1 个答案:

答案 0 :(得分:1)

根据我的经验,如果当前的语言环境设置不适用于上午/下午转换不起作用(也不适用于[CultureInfo] :: InvariantCulture)。

您需要指定支持am / pm

的cultureinfo对象
$enUS = 'en-US' -as [Globalization.CultureInfo]
$val1 = (get-date).ToString("M/d/yyyy H:mm:ss tt", $enUS)
$val1
[DateTime]::ParseExact($val1, "M/d/yyyy H:mm:ss tt", $enUS)