我正在整理一些自定义监控解决方案,日志包含不同的日期/时间条目。尝试从日志中解析日期/时间(文本值)并转换为日期值,以便我可以与其他人或系统日期进行比较。我过去曾使用过以下内容,但我无法更改为允许单位数DD值和12小时时钟值。
$line = "=== 2018-01-07 03:30:25,889 [ng)'] INFO"
$dateTimeString = [regex]::Matches($line, '(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d)')[0].Groups[1].Value
$provider = New-Object System.Globalization.CultureInfo "en-US"
$dateTime = [datetime]::ParseExact($dateTimeString, 'yyyy-MM-dd HH:mm:ss', $provider)
但需要转换以下内容。
$ line =“错误 - 2018年1月7日美国东部时间上午2:13:19 - 警告”
我确定parseexact将是: $ dateTime = [datetime] :: ParseExact($ dateTimeString,'MMM d,yyyy h:mm:ss tt',provider)
但是我在使用Matches函数将文本解析为这些值时遇到了问题。
编辑: 在使用Bill的建议之后,当明确地分配变量时,它可以工作。但是,当我将Get-Content假脱机到变量时,它不会。
$line = Get-Content $SBWebPath | Select-String $SBError -casesensitive |select -last 1
Write-Output $line
$line | Select-String '^####<(\S+ \S+, \S+ \S+ \S+) \S+> <Warning>' | ForEach-Object {
$dateTime = $_.Matches[0].Groups[1].Value -as [DateTime]
}
$dateTime
输出:
####<Dec 7, 2017 5:17:26 AM EST> <Warning> <HTTP>
EDIT2:
如Bill所述,$ line被转换为数组,因此ForEach-Object无法解析数组。通过添加| Out-String到该行的末尾,然后它能够将其解析为字符串。
最终守则有效:
$line = Get-Content $SBWebPath | Select-String $SBError -casesensitive | Select -last 1 | Out-String
Write-Output $line
$line | Select-String '^####<(\S+ \S+, \S+ \S+ \S+) \S+> <Warning>' | ForEach-Object {
$dateTime = $_.Matches[0].Groups[1].Value -as [DateTime]
}
$dateTime
为所有人喝彩。
答案 0 :(得分:0)
这是一种(相当短暂的)方式:
$line = "Error - Jan 7, 2018 2:13:19 AM EST - Warning"
$line | Select-String '^Error - (\S+ \S+, \S+ \S+ \S+) \S+ -' | ForEach-Object {
$dateTime = $_.Matches[0].Groups[1].Value -as [DateTime]
}
$dateTime
这种方法的一个警告是你丢失了时区信息。
要为整个文件执行此操作,您可以编写与此类似的内容:
Get-Content file.txt | ForEach-Object {
# $_ here means "current line from input file"
$_ | Select-String '^Error - (\S+ \S+, \S+ \S+ \S+) \S+ -' | ForEach-Object {
# $_ here means "current MatchInfo object"
$_.Matches[0].Groups[1].Value -as [DateTime]
}
}
答案 1 :(得分:0)
我使用Get-Date命令将字符串转换为日期,以避免围绕文化设置或本地计算机设置出现问题。
(Get-Date -Year 2000 -Month 12 -Day 31).DayOfYear
我使用LastWriteTime命令更新了文件的修改日期。我解析了文件名以获得日期和时间。
$_.LastWriteTime = Get-Date -Year $y -Month $m -Day $d -Hour $h -Minute $n -Second $s
我更新整个文件目录的修改日期的代码如下。我已经包含了我在构建此脚本期间使用的所有额外的echo语句。希望这种冗长的语气可以帮助您更好地理解每个步骤。
Get-ChildItem 'C:\*.jpg' | ForEach-Object {
# File Info
echo $_.FullName
echo $_.BaseName
echo $_.BaseName.IndexOf(" . ")
echo $_.BaseName.SubString(26,17)
$y = $_.BaseName.SubString(26,4)
$m = $_.BaseName.SubString(31,2)
$d = $_.BaseName.SubString(34,2)
$h = $_.BaseName.SubString(37,2)
$n = $_.BaseName.SubString(39,2)
$s = $_.BaseName.SubString(41,2)
$date = "$y,$m,$d,$h,$n,$s"
echo $date
# Modified Date
echo $_.LastWriteTime
# Update Modified Date
$_.LastWriteTime = Get-Date -Year $y -Month $m -Day $d -Hour $h -Minute $n -Second $s
echo $_.LastWriteTime
}