PowerShell实现findstr等效功能:筛选今日文件并匹配文本
PowerShell 脚本实现指定文件内容查找(替代findstr)
完整解决脚本
# 定义今日时间范围:覆盖今日00:00:00到23:59:59的所有文件 $todayStart = (Get-Date).Date $todayEnd = $todayStart.AddDays(1) # 筛选目标文件:C:\Temp下以Filename1开头、今日修改的文件 $targetFiles = Get-ChildItem -Path "C:\Temp" -Filter "Filename1*" -File | Where-Object { $_.LastWriteTime -ge $todayStart -and $_.LastWriteTime -lt $todayEnd } # 遍历文件,查找同时包含两个指定字符串的行(与需求匹配),输出格式对齐findstr foreach ($file in $targetFiles) { Get-Content -Path $file.FullName | # 用-like做精确字符串匹配(等效findstr /C参数),避免正则特殊字符干扰 Where-Object { $_ -like "*Firmware version text*" -and $_ -like "*Class::Method1*" } | ForEach-Object { Write-Output "$($file.Name): $_" } }
针对之前问题的修正说明
日期筛选不准确问题
- 错误原因:直接用
LastWriteTime -eq (Get-Date).Date只会匹配刚好在今日0点整修改的文件,忽略了带时分秒的修改时间。 - 修正方案:通过时间范围判断(
-ge 今日0点且-lt 明日0点),覆盖今日所有时间段修改的文件。
- 错误原因:直接用
内容匹配错误问题
- 如果用
-match默认是正则匹配,Class::Method1中的::是正则特殊字符,会导致匹配异常;改用-like或Select-String -SimpleMatch可以实现精确字符串匹配,和findstr的行为完全一致。 - 若需要等效findstr默认的「任意匹配其中一个字符串」,只需把
-and替换为-or。
- 如果用
简化版(用Select-String)
如果追求更简洁的写法,可以用Select-String直接处理文件和匹配:
$todayStart = (Get-Date).Date $todayEnd = $todayStart.AddDays(1) Get-ChildItem -Path "C:\Temp" -Filter "Filename1*" -File | Where-Object { $_.LastWriteTime -ge $todayStart -and $_.LastWriteTime -lt $todayEnd } | Select-String -SimpleMatch -Pattern "Firmware version text", "Class::Method1" | # 若需同时包含两个字符串,添加以下Where-Object过滤 # Where-Object { $_.Matches.Count -eq 2 } | ForEach-Object { Write-Output "$($_.Filename): $($_.Line)" }
内容的提问来源于stack exchange,提问作者Michele
相关产品推荐
相关产品推荐

