首页 > 解决方案 > 不在forin循环中的变量中添加数据

问题描述

我尝试解析日志,但在forin循环中遇到了一些问题。E_ERROR 变量在循环结束后清除,但 W_ERROR var 内容数据。我做错了什么?


$PATH = "C:\inlogs"
$LOGFILES = Get-ChildItem -Include @("*.log") -Path $PATH -Recurse;
$WORKFOLDER = "C:\outlogs"
$E_ERROR = ""
$W_ERROR = ""
foreach ($LOGFILE in $LOGFILES) {
    $LOGNAME = $LOGFILE.Name
    Write-Host $LOGFILE 
    $ELOGPATH = $WORKFOLDER + "\" + $LOGFILE.Name + ".E.log"
    $WLOGPATH = $WORKFOLDER + "\" + $LOGFILE.Name + ".W.log"

    foreach($line in [System.IO.File]::ReadLines($LOGFILE)) {
        if($line -match ',"Error",'){
            $E_ERROR += $line + "`r`n"
        } elseif ($line -match ',"Warning",') {
            $W_ERROR += $line + "`r`n"
        }    
    }
}
Out-File -FilePath $ELOGPATH -InputObject $EERROR -Encoding UTF8
Out-File -FilePath $WLOGPATH -InputObject $WERROR -Encoding UTF8

标签: powershell

解决方案


这个版本应该可以按预期工作,它也

  • 使用 Join-Path 构建日志文件名
  • 避免双重扩展.log.E.log
$PATH = "C:\inlogs"
$LOGFILES = Get-ChildItem -Include @("*.log") -Path $PATH -Recurse;
$WORKFOLDER = "C:\outlogs"

foreach ($LOGFILE in $LOGFILES) {
    $LOGNAME = $LOGFILE.BaseName
    Write-Host $LOGFILE 
    $ELOGPATH = Join-Path $WORKFOLDER ($LOGName+'.E.log')
    $WLOGPATH = Join-Path $WORKFOLDER ($LOGName+'.W.log')
    $E_ERROR = ""
    $W_ERROR = ""
    foreach($line in [System.IO.File]::ReadLines($LOGFILE)) {
        if($line -match ',"Error",'){
            $E_ERROR += $line + "`r`n"
        } elseif ($line -match ',"Warning",') {
            $W_ERROR += $line + "`r`n"
        }    
    }
    Out-File -FilePath $ELOGPATH -InputObject $E_ERROR -Encoding UTF8
    Out-File -FilePath $WLOGPATH -InputObject $W_ERROR -Encoding UTF8
}

推荐阅读