使用PowerShell筛选当日含scp error的日志并导出无扩展名文件名
问题解决:筛选当日含指定错误日志的文件并记录文件名
原代码存在的问题
- 文件筛选逻辑错误:原代码匹配
File*.log,未按当日时间戳(yyyymmdd)规则筛选目标文件 - 内容匹配效率低且逻辑偏差:逐行读取文件并判断整行完全等于"scp error",实际需求是判断行中包含该字符串,且逐行读取的方式远不如专用字符串匹配 cmdlet 高效
- 冗余操作:代码中尝试重命名文件完全没必要,仅需提取无扩展名文件名即可
- 变量未初始化:
$stat未提前赋值,若文件无匹配内容,变量为null会导致后续判断异常 - 文件写入语法错误:
Add-Content参数顺序错误,且路径存在无效字符
修正后的代码
# 获取当日日期,格式为yyyymmdd $today = Get-Date -Format 'yyyyMMdd' # 精准筛选当日时间戳命名的.log文件(仅匹配文件,排除目录) $targetFiles = Get-ChildItem -Path ".\*$today.log" -File # 存储符合条件的文件名 $errorFileNames = @() foreach ($file in $targetFiles) { # 高效判断文件是否包含"scp error"字符串 if (Select-String -Path $file.FullName -Pattern "scp error" -Quiet) { # 直接获取无扩展名的文件名,加入结果集合 $errorFileNames += $file.BaseName } } # 将结果写入redrop_files.txt,覆盖原有内容 if ($errorFileNames.Count -gt 0) { $errorFileNames | Set-Content -Path ".\redrop_files.txt" } else { # 无匹配文件时清空目标文件 Set-Content -Path ".\redrop_files.txt" -Value "" }
代码关键说明
- 当日文件筛选:通过
Get-Date -Format 'yyyyMMdd'生成当日时间戳,结合通配符精准匹配目标日志文件 - 高效内容匹配:使用
Select-String -Quiet直接返回布尔值,判断文件是否包含指定字符串,比逐行读取效率更高 - 文件名提取:利用
$file.BaseName直接获取文件的无扩展名名称,无需手动替换字符串 - 结果写入:通过
Set-Content一次性写入所有结果,保证文件内容为最新筛选结果,避免多次追加的冗余内容
内容的提问来源于stack exchange,提问作者cherag dubey
相关产品推荐
相关产品推荐

