Powershell Select-String 从变量中删除匹配的字符串行

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

有人能告诉我哪里错了吗?

答案1

与通常使用 PowerShell 的情况一样 - 您看到的内容与您得到的并不完全相同。您尝试检查的数据Where-Object$_.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将包含对象而不是实际文本,因此要获取文本,您需要修改命令。

编辑:如果你只想要文字删除你提到的那一行:

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[]],最后删除所需的元素。

相关内容