Powershell Select-String для удаления строки из переменной при совпадении

Я пытаюсь сделать следующее:

  1. найдите файл в папке, которая была изменена за последние 24 часа
  2. найти определенный раздел файла
  3. удалить строки из раздела, соответствующего конкретной строке(строкам)

вот код у меня есть до сих пор:

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

приведенный выше код не возвращает никаких объектов. Впрочем, если я удалю | Where-Object {$_ -notmatch 'Files updated on right side'} возвращает полный текст:

> 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

может кто-нибудь сказать мне, где я я иду неправильно, пожалуйста?

18
задан Indrek
23.05.2023 20:32 Количество просмотров материала 2830
Распечатать страницу

1 ответ

как обычно с PowerShell-то, что вы видите, не совсем то, что вы получаете. Данные, которые вы пытаетесь проверить с Where-Object is $_.Context.PostContext.

что-то вроде следующего сработало для меня:

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

пожалуйста, имейте в виду, что $summaryData будет содержать объекты, а не собственно текст, так чтобы вместо текста вам нужно изменить команду.

EDIT: если вы хотите просто текст и избавиться от одной линии у вас есть упоминается:

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

строит массив строк из $_.Line (захват линии) и $_.Context.PostContext (все, что было захвачено -Context параметр), выводится как [String []], и, наконец, удаляет элемент, который вы после.

2
отвечен BartekB 2023-05-25 04:20

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх