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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .