PowerShell:从字符串中提取时间戳

时间:2012-05-22 22:15:26

标签: powershell

我是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.

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

05/22/2012 14:54:55

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:6)

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

$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'

答案 1 :(得分:1)

或简单地说:

($line -split ':\s+|:\d{3,}')[2]

答案 2 :(得分:0)

以上参考文献,我可以在我的案例中做到以下

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

DefaultSource; Verbose; 8; 9/5/2016 1:05:19 PM; xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DefaultSource; Verbose; 8; 9/5/2016 1:05:20 PM; yyyyyyyyyyyyyyyyyyyyyyyyyyyyyy DefaultSource; Verbose; 8; 9/5/2016 1:05:20 PM; zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz z

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

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

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

以DateTime格式获取第一个值

PS C:\> [datetime] $ dd =($ lines |%{[regex] ::匹配($ _,'(\ 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