PowerShell: поиск по всему файлу любой строки между конкретными строками и вывод в другой файл

361
Michael

Я не могу найти точный ответ для моего конкретного использования в одном месте, поэтому я спрашиваю. Я очень новичок в 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, который был намного быстрее, но все равно содержал дополнительную информацию, которую я не хотел. Спасибо за вашу помощь!

0
Если это используется для файлов XML, почему бы не взглянуть на возможности разбора inot xml в Powershell? uSlackr 5 лет назад 0

1 ответ на вопрос

0
Justin Pearce

Вы можете использовать синтаксический анализ XML в Powershell! Таким образом, вы можете просто прочитать содержимое элемента 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 } }