1

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

字符串:

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
}
4

1 回答 1

0

好的,这次我将作为答案发布,以提供更灵活的格式,并且因为我相信这最终会解决问题。;)

试试这个:

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

(?s)意味着通配符可以匹配换行符。分组([^\r\n]*)匹配直到行尾,并且.*?匹配换行符。以下内容也可以:

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

事实上,由于你真的只想从“Destination:”之后匹配到行尾,你可以这样做,这是最简单的(除非你特别想确保只匹配“Start time:” " 是接下来的事情):

$destinationregex = 'Destination: (.*)'

如果它仍然不起作用,可能是因为 $message 被读取为数组而不是字符串。$message.GetType()您可以通过在设置 $message 后立即添加调试行来轻松测试它。如果它是一个数组,请尝试以这种方式设置 $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
}
于 2013-05-10T22:01:03.123 回答