5

我是 PowerShell 的新手,并且已经弄清楚如何从日志文件中提取相关行:

C:\Documents and Settings\admin\Local Settings\Application Data\Microsoft\SyncToy\2.0\SyncToyLog.log:325:SYNC: 05/22/2012 14:54:55:857: SyncToy run of Profile Backup (C:\Documents and Settings\admin\, H:\Sync\) completed at 5:22/2012 2:54:55 PM.

我想做的是将第一个时间戳无毫秒(使用 24 小时时间的时间戳)提取到变量中。结果:

05/22/2012 14:54:55

任何援助将不胜感激。

4

3 回答 3

8

一种方法是使用正则表达式解析日期/时间字符串,然后将其转换为日期/时间对象:

$line = 'C:\Documents and Settings\admin\Local Settings\Application Data\Microsoft\SyncToy\2.0\SyncToyLog.log:325:SYNC: 05/22/2012 14:54:55:857: SyncToy run of Profile Backup (C:\Documents and Settings\admin\, H:\Sync\) completed at 5:22/2012 2:54:55 PM.'

$dateTimeString = [regex]::Matches($line, '(\d\d/\d\d/\d\d\d\d.+): ')[0].Groups[1].Value

然后将其转换为日期时间对象:

$provider = New-Object System.Globalization.CultureInfo "en-US"

$dateTime = [datetime]::ParseExact($dateTimeString, 'MM/dd/yyyy HH:mm:ss:fff', $provider)

现在您可以根据需要显示它或将其存储在变量中:

$dateTime -f 'MM/dd/yyyy HH:mm:ss'
于 2012-05-22T23:02:43.177 回答
1

或者简单地说:

($line -split ':\s+|:\d{3,}')[2]
于 2012-05-23T05:15:44.963 回答
0

有了上述参考资料,我可以在我的情况下做以下事情

我有如下数据行的日志文件

DefaultSource;详细;8;9/5/2016 下午 1:05:19;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DefaultSource;Verbose;8;9/5/2016 1:05:20 PM;yyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 默认来源
;详细;8;9/5/2016 1 :05:20 PM;zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

PS C:\> $lines = Get-Content "~\Documents\FileName.log"

下面的行提取模式 'd/m/yyyy h:mm:ss [A/P]M' 并显示所有匹配的捕获

PS C:\> $ 行 | %{[正则表达式]::Matches($_,'(\d+/\d+/\d\d\d\d)\s(\d+:\d+:\d+)\s([AP]M)' )} | 选择捕获

获取日期时间格式的第一个值

PS C:\> [日期时间]$dd = ($lines | %{[regex]::Matches($_,'(\d+/\d+/\d\d\d\d)\s(\d+: \d+:\d+)\s([AP]M)')} | 选择 -First 1 Value).Value

PS C:\> $dd.GetType().FullName
System.DateTime

PS C:\> $dd
2016 年 9 月 5 日星期一 12:53:20 PM

于 2016-09-12T13:11:59.810 回答