PowerShell: пошук у всьому файлі для будь-якого рядка між певними рядками та виведенням в інший файл


0

Я не можу знайти точну відповідь для мого конкретного використання в одному місці, тому я прошу. Я дуже новачок у 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
  }
}

Це здебільшого працює, але він розміщує "Тег" та "/ Тег" (всередині кутових дужок) у вихідний файл, чого я не хочу. Я хочу лише те, що знаходиться між цими тегами. Це дуже повільний сценарій, який потребує декількох хвилин, щоб виконати 165+ файлів. Я експериментував з іншим кодом, використовуючи Select-String, який був набагато швидшим, але він все ще включав додаткову інформацію, яку я не хотів. Дякую за всю допомогу!


Якщо це використовується для XML-файлів, чому б не шукати inot xml для розбору можливостей Powershell?
uSlackr

Відповіді:


0

Ви можете використовувати 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
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.