Datetime Powershell:需要转换变量编码
我一直在编写Powershell脚本,以便从事件日志中获取所有Datetime Powershell:需要转换变量编码,datetime,powershell,character-encoding,Datetime,Powershell,Character Encoding,我一直在编写Powershell脚本,以便从事件日志中获取所有6008事件(意外关机)。然后,我解析了$\消息以获取关机的日期和时间,并试图将其转换为[datetime]。但是,我无法使用ParseExact格式化日期,因为日期/时间中有隐藏字符(它们看起来像日期中每个月、日和年值之前的空心方块)。我猜这是一个编码问题;将变量转换为纯文本(ascii?UTF8?)以便将此字符串格式化为[datetime]的最佳方式是什么 脚本: $timefmt = "M/dd/yyyy h:mm:ss tt"
6008
事件(意外关机)。然后,我解析了$\消息
以获取关机的日期和时间,并试图将其转换为[datetime]
。但是,我无法使用ParseExact
格式化日期,因为日期/时间中有隐藏字符(它们看起来像日期中每个月、日和年值之前的空心方块)。我猜这是一个编码问题;将变量转换为纯文本(ascii?UTF8?)以便将此字符串格式化为[datetime]
的最佳方式是什么
脚本:
$timefmt = "M/dd/yyyy h:mm:ss tt"
$Messages = (get-eventlog -LogName System -ComputerName svr-name | Where-Object {$_.EventID -eq 6008 -AND $_.timegenerated -gt (get-date).adddays(-35) }| select message)
$Messages | ForEach-Object {
$Matched = $_.Message -match "([0-9]{1,2}:.*[0-9]{4})"
if ($Matched) {
$SplitMatches = $Matches[1].split(" ")
$time,$ampm,$on,$date = $SplitMatches
$td = "$date $time $ampm
[datetime]::ParseExact($td,$timefmt,$null)
}
}
我想做的是这样的:
[datetime]::ParseExact([ascii]$td,$timemt,$null)
但这是不正确的,我甚至不确定ascii是否是我所需要的。问题在于消息HEX 3F中的隐藏字符,但我们可以在正则表达式中对此进行解释,并克服它。我使用了4个捕获组,最后加入了最后3个组,以确定不包含隐藏字符的日期 我不习惯您如何进行匹配,所以我对它的格式有点不同。我还在Get-EventLog cmdlet上使用了-After,而不是事后过滤,因为在提供程序处进行过滤通常要快得多
$timefmt = "M/d/yyyy h:mm:ss tt"
$Messages = get-eventlog -LogName System -After (Get-Date).AddDays(-35) | Where-Object {$_.EventID -eq 6008 }| select -expand message
$Messages |?{$_ -match "(\d{1,2}:\d{1,2}:\d{2} (?:A|P)M) on .(\d{1,2}/).(\d{1,2}/).(\d{4})"}| ForEach-Object {
$Time = $Matches[1]
$Date = $Matches[2..4] -join ""
[datetime]::ParseExact("$Date $Time",$timefmt,$null)
}