我正在尝试执行以下操作:
- 查找文件夹中过去 24 小时内被修改过的文件
- 查找文件的特定部分
- 从与特定字符串匹配的部分中删除行
这是我目前拥有的代码:
$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[]],最后删除所需的元素。