PowerShell: pesquisa o arquivo inteiro para qualquer cadeia entre cadeias específicas e saída para outro arquivo

0

Não consigo encontrar uma resposta exata para o meu uso particular em um local, por isso estou perguntando. Eu sou muito novo no PowerShell, então os comandos são estranhos para mim.

Usando o PowerShell, como posso pesquisar um arquivo em todas as ocorrências de "qualquer string" entre duas strings específicas e, em seguida, exibir cada ocorrência de "qualquer string" em outro arquivo de texto? Lembre-se, "qualquer string" varia enquanto as strings específicas são as mesmas a cada vez.

Observação: meu código abaixo, na verdade, pesquisa todos os arquivos .xml em uma pasta específica, que é o que eu quero fazer.

Veja o que eu tenho atualmente:

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

Isso funciona principalmente, mas coloca o "Tag" e "/ Tag" (dentro dos colchetes angulares) no arquivo de saída, o que eu não quero. Eu só quero o que há entre essas tags. Este é um script muito lento, levando vários minutos para ser concluído em mais de 165 arquivos. Eu experimentei outro código usando Select-String que era muito mais rápido, mas ele ainda incluía informações extras que eu não queria. Obrigado por toda sua ajuda!

    
por Michael 19.09.2018 / 18:54

1 resposta

0

Você pode aproveitar a análise de XML de maneira nativa no Powershell! Dessa forma, você pode simplesmente ler o conteúdo do elemento XML em vez de tentar regexar tudo.

$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
  }
}
    
por 19.09.2018 / 21:26