Powershell Select-String para remover uma linha de string de uma variável se combinada

2

Estou tentando fazer o seguinte:

  1. Procure um arquivo em uma pasta que tenha sido modificada nas últimas 24 horas
  2. Encontre uma seção específica do arquivo
  3. Remover linhas da seção que correspondem a cadeia (s) específica (s)

Aqui está o código que tenho até agora:

$SummaryData = gci
| where {([datetime]::now - $_.lastwritetime).TotalHours -lt 24}
| get-content
| select-string 'SUMMARY' -context 0,10
| Where-Object {$_ -notmatch 'Files updated on right side'}

O código acima não retorna objetos. No entanto, se eu remover | Where-Object {$_ -notmatch 'Files updated on right side'} , ele retornará o texto completo:

> SUMMARY
  ------------------------------------------------------------------
  Short Results: 15 copied (203.3GB)
  Operation completed at 22:11:21 on 02/02/2013
  Total duration: 01:01:49

  Copied To Right Side: 15 (203.3GB)
  Files updated on right side : 15

  Transfer amount saved due to partial file updating : 196.2GB
  Remaining actual transfer amount for eligible files: 7.1GB

Alguém pode me dizer onde estou errado, por favor?

    
por user195234 03.02.2013 / 23:53

1 resposta

2

Como normalmente acontece com o PowerShell - o que você vê não é (exatamente) o que você obtém. Os dados que você tenta verificar com Where-Object são $_.Context.PostContext .

Algo como o seguinte funcionou para mim:

$SummaryData = Get-ChildItem | 
    where {(New-TimeSpan -Start $_.LastWriteTime).TotalHours -lt 24} | 
    select-string 'SUMMARY' -context 0,10 | 
    Where-Object {$_.Context.PostContext -notmatch 'Files updated on right side'}

Por favor, tenha em mente que $summaryData conterá objetos em vez de texto real, então, para obter texto, você precisa modificar o comando.

EDIT: Se você quiser apenas texto e se livrar da única linha que você mencionou:

Get-ChildItem | 
    where {(New-TimeSpan -Start $_.LastWriteTime).TotalHours -lt 24} | 
    select-string 'SUMMARY' -context 0,10 | 
    foreach {@($_.Line) + @($_.Context.PostContext) } | 
    where { $_ -notmatch 'Files updated on right side' }

Isso cria uma matriz de strings de $_.Line (linha capturada) e $_.Context.PostContext (tudo o que foi capturado pelo parâmetro -Context ), gera como [String []] e, finalmente, remove o elemento que você está procurando. .

    
por 04.02.2013 / 00:03