You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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 ""
}

代码关键说明

  1. 当日文件筛选:通过Get-Date -Format 'yyyyMMdd'生成当日时间戳,结合通配符精准匹配目标日志文件
  2. 高效内容匹配:使用Select-String -Quiet直接返回布尔值,判断文件是否包含指定字符串,比逐行读取效率更高
  3. 文件名提取:利用$file.BaseName直接获取文件的无扩展名名称,无需手动替换字符串
  4. 结果写入:通过Set-Content一次性写入所有结果,保证文件内容为最新筛选结果,避免多次追加的冗余内容

内容的提问来源于stack exchange,提问作者cherag dubey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:00:59