Powershell正则表达式没有触发

时间:2013-05-03 10:09:54

标签: .net regex powershell powershell-v2.0

我在使用正则表达式提取字符串的一部分时遇到问题,我无法看到我做错了什么。

字符串:

Backup job DailyBackupToNAS completed successfully.   Destination: Network location Start time: 01/05/2013 05:00:28 End time: 01/05/2013 05:39:13 Duration: 00:38:45.5875346

代码:

$destinationregex = "Destination: (.*)Start time:"
If ($message -match $destinationregex)
{
    $destination = $matches[1]
}

我正在尝试提取文本网络位置

任何指针都将不胜感激!

根据要求提供更全面的代码 $ events = get-eventlog application -source BackupAssist -newest 50

Foreach ($event in $events)
{
  $message = $event.message
  $destinationregex = "Destination: (.*)Start time:"
  If ($message -match $destinationregex)
  {
    $destination = $matches[1]
  }
  Else
  {
    $destination = "Unknown"
  }
  Write.Host $destination
}

1 个答案:

答案 0 :(得分:0)

好的,这次我发布了一个答案,更灵活的格式化,因为我相信这最终会解决问题。 ;)

试试这个:

$destinationregex = '(?s)Destination: ([^\r\n]*).*?Start time:'

(?s)表示通配符可以匹配换行符。分组([^\r\n]*)匹配到行尾,.*?与换行符匹配。以下也适用:

$destinationregex = 'Destination: (.*?)\r\nStart time:'

事实上,既然你真的只想从“目的地:”之后匹配到行尾,你可以这样做,这是最简单的(除非你特别想确保你只匹配“开始时间:“是下一件事:”

$destinationregex = 'Destination: (.*)'

如果它仍然不起作用,可能是因为$ message被读取为数组而不是字符串。您可以在设置$ message后立即添加调试行$message.GetType()来轻松测试。如果它是一个数组,请尝试以这种方式设置$ message(除了使用上面的一个正则表达式):

$message = $event.message | Out-String

事实上,这样做可以在任何一种情况下都有效,但如果| Out-String已经是一个字符串,foreach ($event in $events) { $message = $event.message | Out-String $destinationregex = 'Destination: (.*)' If ($message -match $destinationregex) { $destination = $matches[1] } else { $destination = "Unknown" } Write-Host $destination } 是多余的,尽管它没有受到伤害。

为清楚起见,这里是修改后的代码块,因为我认为它将最终结束,具体取决于上述问题的答案:

{{1}}