【问题标题】:PowerShell DateTime ConversionPowerShell 日期时间转换
【发布时间】:2019-09-11 17:38:20
【问题描述】:

我有这个脚本,用于处理包含日期格式为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"
    }
}

【问题讨论】:

    标签: powershell date


    【解决方案1】:

    您的代码有两个问题:

    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])
    

    【讨论】:

    • 效果很好,感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2010-10-12
    相关资源
    最近更新 更多