首页 > 解决方案 > PowerShell 日期时间转换

问题描述

我有这个脚本,用于处理包含日期格式为yyyy-MM-dd HH:mm:ss. 但是,我不知道如何读取格式化yyyy-MM-dd:HH:mm:ss为日期格式的日志条目。

我一直在尝试使用ParseExact()为我转换日期,但我似乎无法让它工作,我认为这是一个错误;

无法将值“2019-09-10:12:40:03”转换为类型“System.DateTime”。错误:“字符串未被识别为有效的日期时间。”

$logfile =  "C:\logs\APP.log"
cat $logfile | Select-String "ERROR" -SimpleMatch | select -Expand line | foreach {
    $_ -match '(.+)ERROR(.+)'| Out-Null 

    $error_time = [DateTime]($matches[1])

    $culture = [Globalization.CultureInfo]::InvariantCulture
    $error_time = [DateTime]::ParseExact("$matches[1]", "yyyy-MM-dd:HH:mm:ss", $culture)
    if ($error_time -gt (Get-Date).AddMinutes(-60)) {
        Write-Host "CRITICAL: There is an error in the log file" $logfile "around "$error_time;
    } else {
        Write-Host "OK: There was no errors in the past 24h"
    }
}

标签: powershelldate

解决方案


您的代码有两个问题:

  1. [DateTime]($matches[1])
    您的时间戳在日期和时间部分之间有一个冒号。这不属于 PowerShell 可以转换为DateTime对象的格式。

  2. 如果您仔细查看错误消息,您会注意到时间戳后面有尾随空格。您使用的模式ParseExact()没有考虑到这一点。此外,放入$matches[1]双引号 ( "$matches[1]") 不会让您将第一个捕获组的值作为字符串。您实际上得到的是"$matches" + "[1]"因为 PowerShell 不支持对字符串中的变量进行索引或点访问。

删除双引号并修剪捕获组的值以删除尾随空格。

$culture = [Globalization.CultureInfo]::InvariantCulture
$error_time = [DateTime]::ParseExact($matches[1].Trim(), 'yyyy-MM-dd:HH:mm:ss', $culture)

另外,删除该行

$error_time = [DateTime]($matches[1])

推荐阅读