我有一些带SOAP的大型日志/转储(1行没有包装)。 首先,我做了一些简单的Select-string:
$where = "D:\log\Test\"
$what = Get-ChildItem $where -Filter "*.txt"
$regex= "(?=<\?xml).*(Envelope>)"
$Path="d:\Log\"
$Result = "D:\Log\wynik2.log"
$string = select-string -Path $what -Pattern $regex
$string
结果如下:
D:\log\Test\test1.txt:1:g .vI.Y....(A..P.......<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">some text1</soap:Body></soap:Envelope>
D:\log\Test\test1.txt:2:g .vJ.YiB..(...P....R..<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">some text2</soap:Body></soap:Envelope>
...
D:\log\Test\test1.txt:4000:g .vL.Yb...'...P.......<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">some text2</soap:Body></soap:Envelope>
如何删除不属于我的SOAP的所有内容(例如:D:\ log \ Test \ test1.txt:4000:g .vL.Yb ...'...... P ...... 。)
答案 0 :(得分:3)
D:\log\Test\test1.txt:1:
是由Select-String
添加的信息(文件中找到的匹配的完整路径和行号)。
如果您的文本文件包含单行XML字符串,并且只想从行的开头删除一些类似这样的内容:
Get-ChildItem $where -Filter '*.txt' | ForEach-Object {
(Get-Content $_.FullName) -replace '^.*?(<\?xml)', '$1' |
Set-Content $_.FullName
}
这枚举给定文件夹中的所有.txt文件,读取其内容,删除行开头(^
)和XML前奏(<\?xml
)之间的字符串,然后写入修改后的文件文字回到文件。
答案 1 :(得分:-1)
不太了解SOAP,但有更多信息可能有助于解析字符串。最简单的方法可能就是遍历你的字符串数组,然后只拉一个从行的开头到<
的索引位置的子字符串,这样就像
foreach($s in $string){
$s.substring(0,$s.indexOf('<'))
}
如果您愿意,也可以使用正则表达式进行操作,但在我看来这是更多的工作。