powershell - 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"
}
}
解决方案
您的代码有两个问题:
[DateTime]($matches[1])
:
您的时间戳在日期和时间部分之间有一个冒号。这不属于 PowerShell 可以转换为DateTime
对象的格式。如果您仔细查看错误消息,您会注意到时间戳后面有尾随空格。您使用的模式
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])
推荐阅读
- python - 在python中使用递归函数和结构类型?
- r - 使用 sparklyr 读取固定宽度的文件
- angular - pdfviewer:无法读取未定义的属性“FontInspector”?
- java - 打印在彼此下方格式化的两行
- firebase - 如何使用 rnfirebase 在 react-native android 中发送带有图像的推送通知
- java - Wildfly Swarm:配置自定义数据源的问题
- java - 如何在 Android 中更改 listView 的字体?
- sql - Oracle SQL:比较日期范围并获取同一天的日期
- ios - 当应用程序崩溃时,该时间设备未连接到 xcode。那么如何查看崩溃日志呢?
- regex - 如何在正则表达式中匹配两个新行(\ n)而不是一个?