2013-05-03 35 views
1

我有一个问题,得到一个正则表达式来提取字符串的一部分,我看不出我做错了什么。Powershell正则表达式不触发

字符串:

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

我想提取文本网络位置

任何指针将不胜感激!

按照要求的代码 $事件更充分的范围=获取,事件日志应用-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 
} 
+0

我用你的例子测试,并为我工作。添加你的错误... – 2013-05-03 10:21:55

+0

这不是错误,但目的地结束了一个空的变量。 – Trinitrotoluene 2013-05-03 10:22:46

+0

检查'$ message'的内容,如果是[string]类型。如果你使用你的例子来模拟,你会发现这个正则表达式是好的,我会在'(。*)'之后添加一个额外的空格来将它从捕获中排除。 – 2013-05-03 10:26:35

回答

0

好吧,我张贴作为回答这个时候,更灵活的格式,并因为我相信这将最终解决问题。 )

尝试这种情况:

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

(?s)意味着通配符可以匹配换行符。分组([^\r\n]*)匹配到该行的结尾,并且.*?匹配换行符。下面将工作太:

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

事实上,因为你真的只是想从后匹配“目标:”到该行的末尾,你可能只是这样做,这是最简单的(除非你特别想确保你只能匹配,如果“开始时间:”是第二天的事情):

$destinationregex = 'Destination: (.*)'

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

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