脚本列出不包含所需内容的所有文件



我试图在dir中找到所有文件,在过去4小时内修改,其中包含字符串。我不能让输出显示不包含所需内容的文件。我如何改变这一点,使它只列出与字符串匹配的文件名和内容,而不是没有该字符串的文件?这是作为windows shell命令运行的。该目录有一个包含数百个文件的不断增长的列表,当前输出如下所示:

File1.txt
File2.txt
File3.txt
... long long list, with none containing the needed string
(powershell "Set-Location -Path "E:SDKLogsLogs"; Get-Item *.* | Foreach { $lastupdatetime=$_.LastWriteTime; $nowtime = get-date; if (($nowtime - $lastupdatetime).totalhours -le 4) {Select-String -Path $_.Name -Pattern "'Found = 60.'"| Write-Host "$_.Name Found = 60";  }}")

我尝试更改Write-Host的位置,但它仍然打印所有文件。

更新:我目前正在修复这个问题。希望这是人们在评论中暗指的。

$updateTimeRange=(get-date).addhours(-4)
$fileNames = Get-ChildItem -Path "K:NotFound" -Recurse -Include *.* 
foreach ($file in $filenames)
{
#$content = Get-Content $_.FullName
Write-host "$($file.LastWriteTime)"
if($file.LastWriteTime -ge $($updateTimeRange))
{
#Write-Host $file.FullName
if(Select-String -Path $file.FullName -Pattern 'Thread = 60')
{
Write-Host $file.FullName
}
}
}

如果我理解正确的话,您只是想显示文件名匹配的内容?如果是这样,下面将为您工作:

$date = (Get-Date).AddHours(-4) 
Get-ChildItem -Path 'E:SDKLogsLogs' | Where-Object -FilterScript { $date -lt $_.LastWriteTime } |
Select-String -Pattern 'Found = 60.' | 
ForEach-Object -Process {
'{0} {1}' -f $_.FileName, $_.Matches.Value
}

在调用之前,Get-Date不需要在变量中,但是,它可以变得计算开销很大一次又一次地运行对它的调用。相反,只需将其放在表达式之前的变量中,并调用已经创建的$date值。

通常,并且为了最佳实践,您总是希望在命令中尽可能地向左过滤。在这种情况下,我们将if语句交换为Where-Object,以便在对象传递到管道时进行过滤。幸运的是,Select-String返回找到的匹配文件名和匹配的内容,因此我们只需在Foreach-Object循环中引用它;也可以使用计算属性。


至于你的引用问题,你可能必须在PowerShell.exe调用中双引号或转义引号以使其正常运行。

编辑:将双引号替换为单引号,这样你就可以在PowerShell.exe -Command "expression here"中包装整个表达式而不需要转义;如果你要查找的模式不包含单引号,

最新更新