更快地删除变量中的第4个冒号?分号

时间:2014-11-08 01:46:34

标签: powershell msmq

我试图用Powershell查询MSMQ,然后从BodyStream中读取(在我的情况下)XML。在XML 之前剥离垃圾......就像每条记录200-500毫秒一样。

拉出XML似乎很快(下面),但是替换需要永远。

$msmq = Get-MsmqQueue -Name "myqueuelovesme"
$var = Receive-MsmqQueue -input $msmq -Peek -Count 500 -Timeout 5000 -RetrieveBody | foreach {
$sr = $_.BodyStream.ToArray()
$pr = $enc.GetString($sr)
[xml]$clean= $pr -creplace ".*:Message:"
select-xml -xml $clean -XPath "/MyXML/Defin" | foreach {$_.node}
}
$var

bodystream的内容如下所示:

F:01.02.03:1234567890:Message:<MyXML><Defin xmlns:dsi="http:// [...]

XML总是在第4个分号之后开始,所以我不认为我可以拆分/加入(因为XML中的分号数量可以改变)。我看到creplace比替换更快,但两者都不是很好。

有什么建议吗? (哎呀,剩下的代码还可以吗?)

2 个答案:

答案 0 :(得分:2)

我想象的选择吨。不确定哪一个是最好的。我会尝试添加一些我们去的地方。肯定会出现其他解决方案。你说你认为你不能分裂/加入 ...... BLAM!

'F:01.02.03:1234567890:Message:<MyXML><Defin xmlns:dsi="http:// [...]'.Split(":",5)[-1]

用冒号分割字符串,但最多只能分为5个元素。然后只返回最后一个元素 <MyXML><Defin...。您可以将此应用于您的实现:

[xml]$clean= $pr.Split(":",5)[-1]

您也可以使用相同的逻辑拆分第一个<

[xml]$clean= "<$($pr.Split("<",2)[-1])"

由于我们正在分割<,我们只需将其添加回字符串即可。

我使用Measure-CommandindexOf进行了Split测试。同时运行100000次大约需要2秒钟。他们都是脖子和脖子。与-creplace相同的测试花了大约7秒钟。 Measure-Command并不完美,其结果可能会受到质疑,但似乎这里的答案(到目前为止)都会表现得更好。

答案 1 :(得分:2)

这是如何表现的?

$clean = [xml]$pr.Substring($pr.IndexOf('<'))