Datetime 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"

我一直在编写Powershell脚本,以便从事件日志中获取所有
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)
}