我似乎无法在一个地方找到适合我特定用途的确切答案,所以我问了。我对 PowerShell 很陌生,所以这些命令对我来说很陌生。
使用 PowerShell,如何在文件中搜索两个特定字符串之间的所有“任意字符串”出现情况,然后将每次出现的“任意字符串”输出到另一个文本文件?请注意,“任意字符串”会变化,而特定字符串每次都相同。
注意:下面的代码实际上搜索特定文件夹中的所有.xml 文件,这正是我想要的。
以下是我目前拥有的:
$path = "E:\files"
$outfile = "E:\testoutput.txt"
$files = Get-Childitem $path *.xml -Recurse | Where-Object { !($_.psiscontainer) }
$pattern = "<Tag>(.*?)</Tag>"
# Loop through all the $files
foreach ($file in $files) {
$file.Name | Out-File $outfile -Append
# Loop through each line that matches $pattern
Get-Content $file.FullName | Where-Object {$_ -match $pattern} | ForEach-Object {
$_ | Out-File $outfile -Append
}
}
这基本上是可行的,但它将“Tag”和“/Tag”(在尖括号内)放入输出文件中,而我并不需要。我只想要这些标签之间的内容。这是一个非常慢的脚本,需要几分钟才能完成 165 多个文件。我尝试过使用 Select-String 的其他代码,速度要快得多,但它仍然包含我不想要的额外信息。非常感谢您的帮助!
答案1
您可以在 Powershell 中原生地利用 XML 解析!这样,您可以简单地读取 XML 元素的内容,而不必尝试对所有内容进行正则表达式处理。
$path = "E:\files"
$outfile = "E:\testoutput.txt"
$files = Get-Childitem $path *.xml -Recurse | Where-Object { !($_.psiscontainer) }
$elem = "Tag" #<- The name of the XML element to find
# Loop through all the $files
foreach ($file in $files) {
$file.Name | Out-File $outfile -Append
$doc = [xml](Get-Content $file.FullName) # <- Read in content as XML
# Loop through each element named by $elem
$doc.GetElementsByTagName($elem) | ForEach-Object {
$_ | Out-File $outfile -Append
}
}