PowerShell:在整个文件中搜索特定字符串之间的任何字符串并输出到另一个文件

PowerShell:在整个文件中搜索特定字符串之间的任何字符串并输出到另一个文件

我似乎无法在一个地方找到适合我特定用途的确切答案,所以我问了。我对 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
  }
}

相关内容