PowerShell: Durchsuchen Sie die gesamte Datei nach beliebigen Zeichenfolgen zwischen bestimmten Zeichenfolgen und geben Sie sie in eine andere Datei aus

393
Michael

Ich kann anscheinend keine exakte Antwort für meine bestimmte Verwendung an einem Ort finden, frage ich. Ich bin sehr neu in PowerShell, daher sind mir die Befehle fremd.

Wie kann ich mit PowerShell eine Datei nach allen Vorkommen von "beliebiger Zeichenfolge" zwischen zwei bestimmten Zeichenfolgen durchsuchen und dann jedes Vorkommen von "beliebiger Zeichenfolge" in einer anderen Textdatei ausgeben? Allerdings ist "jede Zeichenfolge" unterschiedlich, während die spezifischen Zeichenfolgen jedes Mal gleich sind.

Hinweis: Mein Code durchsucht alle XML-Dateien in einem bestimmten Ordner. Dies ist, was ich möchte.

Folgendes habe ich momentan:

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

Das funktioniert meistens, aber es fügt "Tag" und "/ Tag" (in den spitzen Klammern) in die Ausgabedatei ein, was ich nicht möchte. Ich möchte nur, was sich zwischen diesen Tags befindet. Dies ist ein sehr langsames Skript, das bei 165+ Dateien einige Minuten dauert. Ich habe mit anderem Code mit Select-String experimentiert, der sehr viel schneller war, aber dennoch zusätzliche Informationen enthielt, die ich nicht wollte. Danke für all deine Hilfe!

0
Wenn dies für XML-Dateien verwendet wird, schauen Sie sich die XML-Analysefunktionen von Powershell an. uSlackr vor 5 Jahren 0

1 Antwort auf die Frage

0
Justin Pearce

Sie können das XML-Parsing in Powershell nativ nutzen! Auf diese Weise können Sie einfach den Inhalt des XML-Elements lesen, anstatt zu versuchen, alles auszudrücken.

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